Can Pinterest Work For You?

Pinterest.  It’s the latest thing in social networking.  Going to the Pinterest site fills you to the bursting point with eye candy.  You see recipes, beautiful vacation escapes, cute shoes, and crafts you want to try.  Ok, maybe that’s just me.   But the site is filled with wonderful pictures of interesting things that you could spend hours perusing.

But can Pinterest work for your business?  We are at the commencement of the Pinterest era, and people and small businesses are just beginning to harness the power.  Here are some things to think about when trying out Pinterest for your business.

Pinterest links are currently no-follow.  That means that if a person comes to your site through a Pinterest link, it will not move up the search engine ladder.  However, getting any traffic to your site is a good thing, right?  Make sure that you have a great landing page—one that will engage the potential customers and encourage them to look around your site.

Pinterest is filled with pictures.  Do you have a bunch of pictures on your site?  Are the pictures on your site ones that will get people to re-pin and therefore advertise your business?  The Digital Mountain Consulting site has a few pictures, but they are not necessarily engaging enough to be repined.  Maybe Pinterest is not right for DMC, or maybe we need to work on this…  But if you have a site that sells handmade purses, or hard to find musical instruments, Pinterest might be the perfect way to promote these.    You can pin the pictures from your on-line or Etsy store, and drive business to your product.  Or maybe you have a blog that goes along with your sale products.  You can pin the pictures from the blog, and that would naturally drive people to your website without the big sell.

Internet Advertising Makeover Contest – Spring 2012

We were accepting entries into our makeover contest during most of the month of March. We’ve had a chance to review the entries and we’ve selected one first place winner and three runners up! Here they are:

  1. Brian Miller
  2. Mary Wilson
  3. Jez Manto
  4. Gary Frost

Brian Miller has been selected to receive our first place prize of the web advertising makeover! This includes three months of

  • Three free monthly consultations (phone or in our office)
  • Web and Google Presence Bundle
  • $100 of free google advertising!
  • Search Light reports for website and advertising

Runners up receive one month of

  • Free consultation to setup and a first month review (phone or in our office)
  • Google Presence
  • Search Light reports for website and advertising

Thank you everyone for entering!

Actionable Analytics — Part 3

I did it.  I packaged into a video not only the steps from Actionable Analytics — Part 2 but also some insights to help you interpret your Google Analytics (GA) traffic with your crisp new Custom Segment turned on.

You’ll see how focused your GA review time can be with the right goals setup as custom segments.  You’ll know which geographies, referrers, search keywords, content, etc is producing results on your website.  Without delay:

Actionable Analytics – Part 2

It’s time to make your website analytics actionable!  From my last post, Actionable Analytics – Part 1, you should have:

  • Google Analytics installed on your website
  • Created a goal for  Engagement
  • Created a goal for Conversion

If you don’t know what I mean please visit Actionable Analytics – Part 1 to catch up.

The key to knowing what components of your website are producing for you is to look at visits on your website that reach the goals you’ve set.  This is done by creating an Advanced Segment in Google Analytics (GA for brevity) which, when selected, will filter out all the traffic that does NOT reach your goals.

Step 1: Login to your GA account, click “Advanced Segments”, and “New Custom Segment”.  It should resemble:

 

Clicking “New Custom Segment” leads you to:

 

Where you will select a previously created goal in the drop down selector right after “Include” and set the threshold — I like “Greater than 0″.  By setting your advanced segment to show visits and visit data where a goal is >0 will show you visits which reached the goal.  Once you “Save Segment” you’ll be able to select this segment of your traffic when viewing your analytics.  Then everything you see, so long as your segment is selected,  will be activity which occurred during visits which reached your goals!

This is BIG.  You can now locate the Top Geographies, Top Content, Top Referrers, Top Keywords, and any other Top “Dimensions” or “Metrics” you care to consider!  Now go look over your data with a new focus: Find out what’s working and DO MORE OF IT!

To make this process easier to follow this post needs either 1) a lot more pictures or 2) a video.  I’ll get right on that.

Look for Actionable Analytics – Part 3 to contain a video overview of this process.

Actionable Analytics – Part 1

Google analytics (GA) is one of the most powerful tools you’ll find to glean insights into the operation and marketing of a website/mobile app/web app.  However, you’ll find that when you’re looking for the big insights they’re not easy to find.  It takes a knowledge of how to use GA to extract the gems to really build something great.  No surprise there.

In this series of articles I’m going to share with you our approach to clearing away the less fruitful pursuits in your web analytics and focus you on the ones which will yield the biggest insights with the minimum effort.

Install Google Analytics

follow the steps to install Google Analytics on your website at http://www.google.com/analytics/ (Little plug: We do that for no additional cost when you buy either our Search Presence or Search Light services.)

Define goals

The starting point for all good decision making is to decide what is a good thing.  It is no different with your website and advertising.  We always create two “Goals” in Google Analytics.  The first represents a good thing that happens fairly often — we always refer to this as “Engagement”.  Then we create the goal which represents the closest thing your website has to a sale and call this “Conversion.”  We’d always dig in to find the best choice for each of these goal definitions, however for the sake of example let’s say your website doesn’t have any ecommerce but you’re very happy to get sales leads on your site through your contact form.  In this case we’d setup these two goals in GA:

  • Goal 1
    • Give it a name like “Contact Engagement”
    • Type: URL destination
    • Goal URL: /contact (or whatever the path to your contact page is)
    • Match type: regular expression (this allows the URL to match if you have /products/contact, /services/contact, /corporate/contact)
    • Give it a value if you’d like to keep track of the value of these interactions
  • Goal 2
    • Call it “Contact Conversion”
    • Type: URL destination
    • Goal URL: /contact/thankyou (use your actual page address)
    • Match type: regular expression
    • Set the value.  This should be significantly higher.    Engagement is a precursor to the truly valuable interaction — completing the sale

So now you’re off to a good start.  Google will keep track of the goals on your website going forward.  You’ll now be able to see the engagement and conversion taking place on your site.

Truly, this is only the beginning though.  When your reports show you referrers that generate engagement you’ve really got something.  When you know which geographic regions generate engagement you’ve got a little more.  Identify the content on your site that is engaging and BAM!  you’re getting closer.  Keywords that generate engagement are the icing on the cake.  Of course, you need a custom report for all that.  I’ll save that for Part 2.

We wrap all this up in our Search Light service where you don’t have to look at any code or carry out these steps yourself.  Better yet, the report comes to your email as a spreadsheet with exactly what you need to know!

Balance your traffic

Having balanced traffic sources is like having a diversified stock portfolio. It doesn’t mean you can’t make a load of cash off a single stock but your chances of losing a lot are very high too. What percentage of your traffic is from referring sites (Facebook, Twitter, local-news.com, etc), paid advertising, direct traffic, email newsletters, search engines? Balance is something I love. Mostly because the alternative, imbalance, says it all.

I found Chris S. Penn’s excellent article on this topic at http://www.christopherspenn.com/2011/01/how-balanced-is-your-google-analytics-pie/

The good, bad, and ugly of increasing CTR – part 1, The Bad

True, increasing your Click Through Ratio (CTR) will:

Good

  • Make Google, Bing, and Yahoo happy
  • Increase your ad’s quality score
  • Decrease your Cost Per Click (CPC)

Bad

  • Spend your budget faster
  • Decrease the number of impressions your ad gets
  • Increase the cost to keep your ads running for any given date/time schedule

Just from that list you can see there is a trade-off with increasing CTR.  Sometimes this is good.  Sometimes it is not good.  Here’s an example of each.

Good

You’re running a campaign and it costs $1.41/click (CPC = $1.41).  Your total spend is $10.53/day.  You have another $9.47/day budget to buy more clicks to your website.  You’ve checked to see that you’re getting a respectable engagement and conversion from these visitors… You are.  You’ve also been tuning your keywords for months and you don’t have any to add to the mix.  What are you going to do to get more qualified clicks on your website landing pages?  Increase the CTR by rewriting your ads to be BOTH more engaging AND stay true to the landing page.  There are many sources of wisdom on how to increase the CTR for your ads so I won’t touch that right now.  Go Google-Bing-Yahoo-Ask for them.

I’ll offer an example of  the wrong way to increase CTR in part 2, The Bad.

Reporting on Google Analytics and Adwords in Python, Part 2

My previous post gave you some working code to get you started extracting Google analytics data from the API.  While visits and pageviews are important metrics they don’t mean much without context.  In this post I’ll extend the code from the previous post to show the visits and pageviews for each referrer to a site.  That’ll put some meat on these bones!

First, I’ll focus on just the creation of the query URI.  In part 1, our query URL looked like:

query_uri = gdata.analytics.client.DataFeedQuery({
      'ids': PROFILE_ID,
      'start-date': sd,
      'end-date': ed,
      'dimensions': 'ga:date',
      'metrics': 'ga:visits',
	})

and had the output:

ga:date ga:visits
20111121        3214
20111122        2692
20111123        2360
20111124        1537
20111125        2227
20111126        2171
20111127        2220

A query asks the Google Analytics API for all metrics for each dimension specified. In this case the query asks for all “ga:visits” for each “ga:date” dimension which are recorded over the date range from “start-date” to “end-date” for the “ids” specified.

Here’s a new query to show visits and pageviews for all referrers each day inside the date range:

 query_uri = gdata.analytics.client.DataFeedQuery({
      'ids': PROFILE_ID,
      'start-date': sd,
      'end-date': ed,
      'dimensions': 'ga:date,ga:source',
      'metrics': 'ga:visits,ga:pageviews',
        })

And its output looks like:

ga:date ga:source       ga:visits       ga:pageviews
20111121        (direct)        1029    7806
20111121        ask     8       44
20111121        austin360.com   1       12
20111121        bing    133     1130
20111121        en.wikipedia.org        2       40
20111121        facebook.com    2       9
20111121        google  1550    10642
20111121        google.com      6       27
20111121        home.myhughesnet.com    1       2
20111121        yellowbook.com  3       15
20111121        yellowpages.com 1       5
20111121        yelp.com        1       9
... many entries eliminated to protect the innocent
20111122        (direct)        844     4728
20111122        aol     5       11
20111122        ask     4       32
20111122        yahoo   124     1005
20111122        yellowbook.com  2       10
20111122        yellowpages.com 3       31
... many entries eliminated to protect the innocent
20111123        (direct)        793     4256
20111123        aol     9       62
20111123        ask     3       75
20111123        bing    118     867
20111123        yelp.com        1       7
... many entries eliminated to protect the innocent
20111124        (direct)        475     3526
20111124        aol     4       31
20111124        ask     5       37
20111124        bing    60      389
... many entries eliminated to protect the innocent
20111125        (direct)        676     4041
20111125        aol     6       42
20111125        ask     7       44
20111125        bing    99      588
20111125        yahoo   130     1152
20111125        yellowbook.com  3       14
... many entries eliminated to protect the innocent
20111126        (direct)        664     3524
20111126        aol     5       35
20111126        ask     9       34
20111126        bing    76      599
20111126        sxsw.com        7       17
20111126        yahoo   138     1002
20111126        yellowbook.com  5       18
20111126        yellowpages.com 1       19
20111126        yelp.com        2       48
... many entries eliminated to protect the innocent
20111127        (direct)        636     3507
20111127        aol     7       127
20111127        ask     7       67
20111127        bing    84      548
20111127        en.wikipedia.org        1       7
20111127        facebook.com    2       12
20111127        google.com      10      72
20111127        m.yp.com        2       5
20111127        mail.aol.com    1       4
20111127        yahoo   127     1074
20111127        yellowbook.com  3       10
20111127        yellowpages.com 1       1
20111127        yelp.com        2       38

 

Drop the date dimension and you get all referrers in your date range with no date grouping by the “ga:date” dimension. The query:

query_uri = gdata.analytics.client.DataFeedQuery({
      'ids': PROFILE_ID,
      'start-date': sd,
      'end-date': ed,
      'dimensions': 'ga:source',
      'metrics': 'ga:visits,ga:pageviews',
        })

It’s output:

ga:source       ga:visits       ga:pageviews
(direct)        5117    31388
aol     50      386
ask     43      333
bing    677     4705
bookmarks.yahoo.com     2       6
business.com    1       7
google  7937    53270
mws.ask.com     1       10
my.msn.com      1       41
my.yahoo.com    1       3
sxsw.com        33      89
yahoo   875     6789
yellowbook.com  25      104
yellowpages.com 7       68
yelp.com        6       102
... many entries eliminated to protect the innocent

 

Both of those outputs are valuable. First, the referrers, their referral volume, by date is quite valuable. I’d expect to use the second version to get an overview of aggregate referreral volume without the date segmentation to get a feel for a site’s referral health. I’d use the first version to find out when the referrals were delivered.

Here’s the full code for the Python program that produced the second output:

#!/usr/bin/python

'''

Use the Google Data python module to query Google Analytics

You'll get the "PROFILE_ID" from your Google Analytics account.  From the default
listing you click on the account name and then take the "Edit" action on the website
profile you want to find the profile id for.  It is listed near the top right under
"Profile Settings"
'''

__author__ = 'Leo Edmiston-Cyr '

import gdata.analytics.client
import datetime

USERNAME = 'yourAnalyticsAccount@gmail.com'
PASSWORD = 'youToughPassw0rd'
PROFILE_ID = 'ga:1234567' # the GA profile ID to query
SOURCE_APP_NAME = 'GAGettah' # anything you want to call it
sd = datetime.date(2011,11,21)
ed = datetime.date(2011,11,27)
#ed = datetime.date.today()

def main ():

    my_client = gdata.analytics.client.AnalyticsClient(source=SOURCE_APP_NAME)
    my_client.client_login(
        USERNAME,
        PASSWORD,
        SOURCE_APP_NAME,
        service='analytics')

    query_uri = gdata.analytics.client.DataFeedQuery({
      'ids': PROFILE_ID,
      'start-date': sd,
      'end-date': ed,
      #'dimensions': 'ga:date,ga:source', # enable grouping by date
      'dimensions': 'ga:source',
      'metrics': 'ga:visits,ga:pageviews',
        })
    feed = my_client.GetDataFeed(query_uri)

    # find out if this is the first run through the results
    # to build a simple header for the dimensions and metrics
    firstRun = True
    heading = []

    # we'll run through the data feed reutrned from our query
    for entry in feed.entry:

      # build each row of data from the feed
      row = []

      # pull all dimensions out of this entry
      for dim in entry.dimension:
        if firstRun:
                heading.append(dim.name)
        row.append(dim.value)

      # pull all metrics out of this entry
      for met in entry.metric:
        if firstRun:
                heading.append(met.name)
        row.append(met.value)

      # print the dimension and metric names as the header
      if firstRun:
        print "t".join(heading) + "r"

      # print all rows from the feed as they are built
      print "t".join(row) + "r"

      # don't print the dimension and metric names as the header again
      firstRun = False


if __name__ == '__main__':

        main()

Want more dimensions and metrics? Visit the GA API dimensions and metrics reference page http://code.google.com/apis/analytics/docs/gdata/dimsmets/dimsmets.html

These articles were aimed at the technical web marketer who either writes a little code or has a programmer they want to egg on.

Reporting on Google Analytics and Adwords in Python, Part 1

Caution: This post is heavy on the geek.  You’ve been warned!

Here is the simplest example worth trying to get you started

#!/usr/bin/python

'''

Use the Google Data python module to query Google Analytics

You'll get the "PROFILE_ID" from your Google Analytics account.
From the default listing you click on the account name and then
take the "Edit" action on the website profile you want to find
the profile id for.  It is listed near the top right under
"Profile Settings"
'''

__author__ = 'Leo Edmiston-Cyr '

import gdata.analytics.client
import datetime

USERNAME = 'yourAnalyticsAccount@gmail.com'
PASSWORD = 'youToughPassw0rd'
PROFILE_ID = 'ga:1234567' # the GA profile ID to query
SOURCE_APP_NAME = 'GAGettah'
sd = datetime.date(2011,11,21)
ed = datetime.date(2011,11,27)

def main ():

    my_client = gdata.analytics.client.AnalyticsClient(source=SOURCE_APP_NAME)
    my_client.client_login(
        USERNAME,
        PASSWORD,
        SOURCE_APP_NAME,
        service='analytics')

    query_uri = gdata.analytics.client.DataFeedQuery({
      'ids': PROFILE_ID,
      'start-date': sd,
      'end-date': ed,
      'dimensions': 'ga:date',
      'metrics': 'ga:visits',
	})
    feed = my_client.GetDataFeed(query_uri)

    # find out if this is the first run through the results
    # to build a simple header for the dimensions and metrics
    firstRun = True
    heading = []

    # we'll run through the data feed reutrned from our query
    for entry in feed.entry:

      # build each row of data from the feed
      row = []

      # pull all dimensions out of this entry
      for dim in entry.dimension:
        if firstRun:
                heading.append(dim.name)
        row.append(dim.value)

      # pull all metrics out of this entry
      for met in entry.metric:
        if firstRun:
                heading.append(met.name)
        row.append(met.value)

      # print the dimension and metric names as the header
      if firstRun:
	print "t".join(heading) + "r"

      # print all rows from the feed as they are built
      print "t".join(row) + "r"

      # don't print the dimension and metric names as the header again
      firstRun = False

if __name__ == '__main__':

	main()

Here is its output

ga:date ga:visits
20111121        3214
20111122        2692
20111123        2360
20111124        1537
20111125        2227
20111126        2171
20111127        2220

 

In the next post I’ll add some dimensions and metrics.

Dreams of monetization utopia

Visitors to websites rarely enjoy the ads.  Indeed, Google has raised the bar for “useful” and “pertinent” ads.  Even though, people don’t buy things every day nor do they need to think about buying things every day.  Since most ad systems are constantly pitching purchases to you when you, by definition don’t need to buy something nor change your buying habits, there is a mismatch between current monetization schemes for online communities and what community members really want in their community experience.

Advertising must change to sustain communities into the future.  I believe I’m on to something.  I believe every community can have a corresponding store (online and/or physical) which becomes indispensable for the community members.  The community is paid for by being the ultimate reminder for the members of where to shop for community related goods.  This is an improvement over traditional ads because the associated store is there for you only when you’re thinking about the community.  Think about most trail/bicycle/water trail stores — they’re equal parts busieness and social network.  This is a workable solution by my measure; one I like.

How about an example?  Try http://www.mdtrails.com  It is a real community I made several years ago as a testbed for some ideas I was putting together at the time — online community around local, Maryland trails, integrating a social component, and bring in a way to make money that is NOT traditional ad based.  I have used Google ads on MDtrails and many other sites in the past — I know it is a quick solution (Thanks Google).  I just think we need to dig deeper to push our communities into the mid 21 century.

So here is an offer and a challenge to a Maryland trail outfitter with a web catalog — let’s partner to tie MDtrails.com (hikemaryland.com too) to your online store (much like I’ve done with an amazon aStore) and let’s test monetization with a real store, with real profit margins, and a sizeable catalog.

Contact me @ digital mountain consulting if you’re interested.