Daily Search Forum Recap: July 31, 2015

Here is a recap of what happened in the search forums today, through the eyes of the Search Engine Roundtable and other search forums on the web.

Search Engine Roundtable Stories:

Other Great Search Forum Threads:


Source: SEroundTable

Video Recap of Weekly Search Buzz :: July 31, 2015

This week in search, I run really through a ton of search news. I start with Googleâs attempted answer on why Panda 4.2 is rolling out so slowly. I then explain it is a global Panda roll out and I share stats on my siteâs recovery. Google said they wonât give advice on algorithmic issues. Google issued out mass warning notification emails to those who block CSS and JavaScript. I share tips on opening up those CSS and JavaScript assets. Google wonât be indexing content in tabs that dynamically load. Google does check to make sure your mobile and desktop site arenât vastly different. Google increased their server capacity to store more index rates. Bingâs organic search traffic drop is related to Bing not sharing the organic search source drop. Google AdWords updated their quality scores. I have screen shots of the new home service ads in Google. Google Play now has AdWords ads. Google launched the dynamic search ads globally. Google Maps shows when a store or business is at its busiest time. Google is testing hotel price drop cards in Google Now. Google is cutting off access to their auto complete API. Bing is testing an Emoji virtual keyboard. Google said there was a 180% increase in hacked sites in this past year. And Google is killing off the requirement to have a Google+ account to use their services. That was this past week in search at the Search Engine Roundtable.

Make sure to subscribe to our video feed or subscribe directly on iTunes to be notified of these updates and download the video in the background. Here is the YouTube version of the feed:

For the original iTunes version, click here.

Search Topics of Discussion:

Please do subscribe via iTunes or on your favorite RSS reader. Don’t forget to comment below with the right answer and good luck!


Source: SEroundTable

Google: The Slow Panda Roll Out Is Not Designed To Confuse Webmasters

When Google rolled out Panda 4.2 they told me this will roll out over months and months, a very slow roll out. It was just technically how this roll out was happening they told me.

John Mueller in a Google+ Hangout added more things on record about why it is rolling out slowly. Well, why is still not answered but he did add some more advice around the slow roll out.

In summary he said:

  • The roll out is similar to previous roll outs
  • This one is slower because of “technical reasons”
  • John actually said there is “an internal issue” for the technical reason but I am not sure he actually meant that.
  • This is not rolling out slowly to confuse webmasters

He mentioned it in three different points in the hangout, let’s go through each:

At the 25:30 mark the question was:

Hi John my question is Panda related. First of all why you guys decided this update to roll out so slowly. And second could you please tell us how is this update different then the other updates. Is it targeting more then just content?

John answered:

This is actually, pretty much a similar update to before. For technical reasons we are rolling it out a bit slower. It is not that we are trying to confuse people with this. It is really just for technical reasons.

At the 37:14 mark the question asked was:

Panda has run many times over the past few years. This P. run has been said to be a “crawl” lasting several months… Does that mean it’s moving slowly for a one pass over the internet? Does Panda effect a sites rank immediately?

John answered:

So, it is not that we are crawling slowly. We are crawling and indexing normal, and we are using that content as well to recognize higher quality and lower quality sites. But we are rolling out this information in a little bit more slower way. Mostly for technical reasons.

And then later on, at 39:50 mark John added:

It is not like we are making this process slower by design, it is really an internal issue on our side.

Take what you want from these clarification points. It still doesn’t answer all the questions webmasters and SEOs have on the slow Panda 4.2 roll out.

Forum discussion at Google+.


Source: SEroundTable

Google: We Don't Give Advice On Algorithmic Penalties

Google’s John Mueller in this mornings Google Hangout said at the 4:37 mark into the video that Google doesn’t tend to give advice around algorithms.

Yes, for manual actions, they try to give specific advice. But when it comes to being hit by Panda or Penguin or any search quality algorithm, Google says they tend not to give advice.

He said in response to being asked for advice:

I donât know if I can give you specific examples there. We tend not to do that for algorithms when they review the site. Unless it is something really obvious that we can point out. Where we can say well, your home page has hidden text or something like that. For technical reasons that might be something where we can give examples. With search quality algorithms that is usually where we canât give any specific examples from our side.

Here is the video clip:

From experience watching Google help webmasters, this is accurate. Truth is, I think it is often very hard for Googler’s like John Mueller to find an example of why a site may be hit by Panda. Often you see him struggle with it when he is asked about specific cases.

Forum discussion at Google+.


Source: SEroundTable

Google Mysteriously Drops The App Interstitial Notice In The Data Anomalies Page

I don’t get it, why would Google drop content from the Data anomalies in Search Console page?

Jennifer Slegg reported news that Google will be adding to the Google Search Console usability errors for app interstitials. It was based on that page saying that on August 14th, it will be added.

She shared a screen shot:

click for full size

But when I tried investigating it yesterday, I didn’t see that on the page. It was gone. I asked every source I had about it and they had no clue. I am told there are no plans on doing this on a specific date or in the future.

So I don’t get why Google would add and remove that message. I am trying to get an answer from official Google PR channels but again, it is just weird.

Maybe this is something that happened in the past or maybe it is something happening in the future. But Google has not yet done anything with it and hasn’t set a date.

Either way, the bottom line, Google is NOT a fan of app interstitials, so stop using them. Google has said so earlier this week and this is just one more sign of it.

I wouldn’t be surprised if Google did add these warnings and eventually added it as a negative ranking factor.

But for now, we can scratch our heads as to why they removed this from the page.

Forum discussion at Twitter.


Source: SEroundTable

Google No Matches Found Answer

Google Answers are everywhere these days. Search for something and you are very likely to get an answer box at the top of the search results. Be it weather, featured snippets, knowledge graph information or other schema related data.

But if Google doesn’t have the answer, maybe they will tell you they don’t know? Well, in one case they did!

@nakulgoyal shared a screen shot of an answer where Google said “No matching events found.” The query was [when should I go to French Polynesia].

Google didn’t have an answer, so instead of just showing ten blue links to relevant results, which is what I see. Nakul saw a box that said “no matching events found.”

Here is a screen shot:

Google No Matches Found Answer

Pretty funny.

Forum discussion at Twitter.


Source: SEroundTable

Daily Search Forum Recap: July 30, 2015

Here is a recap of what happened in the search forums today, through the eyes of the Search Engine Roundtable and other search forums on the web.

Search Engine Roundtable Stories:

  • Data On My Google Panda 4.2 Recovery

    I initially shared some statistics on my Google Panda 4.2 recovery. As you know, this site was hit by the Panda 4.1. But there is clear evidence things are improving since 4.2.

    Here are some charts, unedited…

  • Google Play AdWords Search Ads

    Google announced the introduction of Search Ads via AdWords on the Google Play Store.

    Google said…

  • Bing Tests Emoji Keyboard

    We know Bing is into their emojis by being one of the first to support Emoji search. But to take that one step further…

  • Photos: New Google Home Services In Search Results

    Dr. Pete Meyers spotted another Google test yesterday and posted it on Twitter it is a preview of what is to come for the new Google Home Services ads.

    In short, this is an ad unit that connects home-service providers to searchers…

  • Google: The Panda 4.2 Refresh Is Rolling Out Globally
    As many of you know, Google confirmed the Google Panda 4.2 refresh last week.
    But one question we did not have answered from Google directly in the public was
  • Log Tables At Google
    Steve Grove from the Google News Lab team shared a picture of log tables at Google. Yes, tables made out of logs of trees. Very rustic and appears to be very green. Steve Grove said “Love these log

Other Great Search Forum Threads:


Source: SEroundTable

SPONSOR MESSAGE: Retargeting On Facebook By The Numbers

For advertisers new to retargeting on Facebook, AdRoll analyzed performance results across advertisers to offer insights on retargeting and to educate marketers on the best way to drive results for their business. Download this report and get key performance metrics for Facebook on desktop and mobile and benchmarks for CTR and CPC.

The post SPONSOR MESSAGE: Retargeting On Facebook By The Numbers appeared first on Search Engine Land.

Source: SEland

Automate Alpha Beta Campaign Structure Using AdWords Scripts

google-adwords-bigA3-1920

I’ve read a lot of blogs and articles about the Alpha Beta Campaign Structure and how it can improve the overall performance of your account. In fact, in a recent AMA with Optmyzr founder and ex-Googler Fredrick Vallaeys on Reddit, he had nothing but good things to say about this approach for campaign management.

I’ve also read that many people believe that maintaining a structure like this is labor-intensive and prone to errors if you aren’t careful. That sounds like a perfect recipe for AdWords Scripts. When I did a few searches on the topic, I saw a few articles mention AdWords Scripts for solving those issues, but I couldn’t find any actual code to use. Maybe it’s out there somewhere, but in the meantime, I figured I’d write my own.

Alpha Beta Campaign Structure

This idea for Alpha Beta campaigns was originally proposed by David Rodnitzky of 3Q Digital. The basic idea is that you to have a set of “beta” campaigns leveraging broad match to find new keywords, and a set of corresponding “alpha” campaigns containing exact match keywords with a proven performance record. I’m not going to describe the technique in full here, but you can read all about it in their guide.

There are a few things that scripts can help with if you decide to maintain this type of campaign structure. First, you can automate pulling the winners and losers from your beta campaigns based on a set of criteria. There are a few scripts out there that do something similar to this already, so it shouldn’t be too difficult.

From that list, you can easily automate adding the losers as negatives to our beta campaigns. You can also create a script to automatically apply the winners in the alpha campaigns as negatives to the beta campaigns.

As for the winners, it is a little harder to automate, so we won’t be covering that here. With proper naming conventions, moving those keywords into their own ad group and adding a set of default ads shouldn’t be too hard. But with all the collection and negative adding taken care of, you should be able to spend more of your time optimizing the winners.

Sounds like we have a lot of work ahead of us, so let’s get started.

Finding Winners, Losers and Not Enough Data

Let’s start with a script to pull the search query report and slice the results into three categories: Winners, Losers, and Not Enough Data. At the top of the script, we will need to define a few settings which should be pretty self-explanatory.

The critical part is determining the winning and losing criteria. As you can see, these consist of a list of clauses that will filter the results of the search query report so that only the keywords that match those criteria are left. You can use almost any column from the search query report and any operator from the AWQL. The other important thing is to make sure that the columns you use in your criteria are in the columns for the search query report.

/*******************************
 * Find the Winners and Losers from the 
 * Search Query Performance report for 
 * Alpha Beta Campaign Strategy.
 *******************************/
// The list of email addresses to send the report to.
// We will also give editor access to the Google Spreadsheet.
var NOTIFY = ['your_email@example.com'];
// The name of the report in your Google drive
var SPREADSHEET_PREFIX = 'AlphaBetaResults - ';
// This string is used to identify your Beta campaigns.
// Make sure this string is found in all your Beta campaign names
var BETA_SUFFIX = '| Beta';
// This is the timeframe used to calculate the statistics.
var REPORT_TIMEFRAME = 'YESTERDAY';
// This is the list of columns that will be displayed in the 
// Winners and Losers report. Make sure that any columns used in
// the Criteria below are listed here as well.
var REPORT_COLUMNS = [
  'CampaignName','AdGroupName',
  'KeywordTextMatchingQuery','MatchType','Query',
  'Impressions','Clicks','Cost','ConvertedClicks'];
// This is the set of criteria that will be used to
// determine the winners. Any of the numerical columns
// should work here. These are just samples, find what
// works for you.
var WINNING_CRITERIA = [
  'Clicks > 100',
  // If using money columns, be sure to represent them in micros
  // https://developers.google.com/adwords/api/docs/guides/reporting-concepts#money
  'Cost < 1000000',   'ConvertedClicks >= 5'
];
var LOSING_CRITERIA = [
  'Impressions > 100',
  'Clicks < 5',   
  'ConvertedClicks = 0' ]; 

function main() {
   generateWinnersLosersReport();
}

function generateWinnersLosersReport() {
  // This string will be appended to the report to create a unique   
  // name each day. If you run this intra-day, you can add hours (HH) to   
  // to the format string. 
  var dateString = Utilities.formatDate(new Date(), 
                                        AdWordsApp.currentAccount().getTimeZone(), 
                                        'yyyy-MM-dd HH');
  var crits = [WINNING_CRITERIA,LOSING_CRITERIA];
  var sheets = [
    getSheet(SPREADSHEET_PREFIX+dateString,'Winners'),
    getSheet(SPREADSHEET_PREFIX+dateString,'Losers')
  ];
  // Grab all the results first. That way we can remove the winners and losers   
  // to keep the ones with "not enough data".
  var allResults = pullSearchQueryPerfReport(REPORT_TIMEFRAME,REPORT_COLUMNS,[]);
  for(var i in crits) {
    var results = pullSearchQueryPerfReport(
      REPORT_TIMEFRAME,
      REPORT_COLUMNS,
      crits[i]
    );
    writeResultsToSheet(results,sheets[i]);
    removeFromAllResults(allResults,results);
  }
  //Handle the 'Not Enough Data' case
  var notEnoughDataSheet = getSheet(SPREADSHEET_PREFIX+dateString,'Not Enough Data');
  writeResultsToSheet(allResults,notEnoughDataSheet);
  sendEmail(sheets,dateString);
}

// This function pulls the search query report and 
// formats it to be easy to insert into a Google Sheet.
function pullSearchQueryPerfReport(timeframe,columns,crit) {
  var reportName = 'SEARCH_QUERY_PERFORMANCE_REPORT';
  var reportQueryTemplate = 'SELECT %s FROM %s WHERE %s DURING %s';
  // Add a criteria so that we only look at data from Beta campaigns.
  crit.push("CampaignName CONTAINS '"+BETA_SUFFIX+"'");
  var reportQuery = Utilities.formatString(reportQueryTemplate, 
                                           columns.join(','), 
                                           reportName,
                                           crit.join(' AND '), 
                                           timeframe);
  var reportIter = AdWordsApp.report(reportQuery,{
      includeZeroImpressions: true
    }).rows();
  var results = [];
  while(reportIter.hasNext()) {
    var row = reportIter.next();
    var rowArray = [];
    for(var i in columns) {
      rowArray.push(row[columns[i]]);
    }
    results.push(rowArray); 
  }
  return results;
}

// This function writes the results to a given spreadsheet
function writeResultsToSheet(results,sheet) {
  if(results.length > 0) {
    var keywordIndex = REPORT_COLUMNS.indexOf('KeywordTextMatchingQuery');
    sheet.appendRow(REPORT_COLUMNS)
    for(var i in results) {
      // if the keyword starts with a plus sign,
      // we need to add an apostrophe so google sheets
      // doesn't get annoyed.
      if(results[i][keywordIndex].indexOf('+') === 0) {
        results[i][keywordIndex] = "'"+results[i][keywordIndex];
      }
      sheet.appendRow(results[i]);
    }
  }
}

// This function removes the results in toRemove from the results
// in the allResults array. Used to remove winners and losers so 
// that all we have left are the "not enough data" queries.
function removeFromAllResults(allResults,toRemove) {
  var allResultsRowHash = {};
  for(var i in allResults) {
    var rowHash = Utilities.base64Encode(JSON.stringify(allResults[i]));
    allResultsRowHash[rowHash] = 1;
  }
  for(var i in toRemove) {
    var rowHash = Utilities.base64Encode(JSON.stringify(toRemove[i]));
    if(allResultsRowHash[rowHash]) {
      allResults.splice(i,1);
    }
  }
}

// Sends the spreadsheet in an email to the people in the
// NOTIFY list. 
function sendEmail(sheets,dateString) {
  var subjectLineTemplate = 'Alpha Beta Results - %s - %s';
  var subjectLine = Utilities.formatString(subjectLineTemplate,
                                           AdWordsApp.currentAccount().getName(),
                                           dateString);
  var bodyTemplate = 'Here is a spreadsheet with the ' +
                     'winners and losers for account: %s: nn %s';
  var body = Utilities.formatString(bodyTemplate,
                                    AdWordsApp.currentAccount().getName(),
                                    sheets[0].getParent().getUrl());
  for(var i in NOTIFY) {
    MailApp.sendEmail(NOTIFY[i], subjectLine, body);
  }
}

// Helper function to get or create a given sheet in 
// a spreadsheet. When creating a new spreadsheet, it also
// adds the emails in the NOTIFY list as editors.
function getSheet(spreadsheetName,sheetName) {
  var fileIter = DriveApp.getFilesByName(spreadsheetName);
  if(fileIter.hasNext()) {
    var ss = SpreadsheetApp.openByUrl(fileIter.next().getUrl());
    var sheets = ss.getSheets();
    for(var i in sheets) {
      if(sheets[i].getName() == sheetName) { 
        sheets[i].clear();
        return sheets[i]; 
      }
    }
    return ss.insertSheet(sheetName);
  } else {
    var ss = SpreadsheetApp.create(spreadsheetName);
    ss.addEditors(NOTIFY);
    var sheet = ss.insertSheet(sheetName);
    ss.deleteSheet(ss.getSheetByName('Sheet1'));
    return sheet;
  }
}

Eliminating The Poor Performers

I recommend running the script above for a little while to make sure you have your criteria set up correctly. Once you’re satisfied with the results, you can easily automate the task of eliminating poor performers from the Beta campaigns.

The following code builds upon what you have already and will automatically add the poor performers as exact match negatives to the corresponding Beta campaign. Just replace the main() function in the previous script and add this additional code.

// Replace the main from above with this one.
// We create the report from before but then
// also add the losers to the beta group.
function main() {
  generateWinnersLosersReport();
  addLosersToBetaGroup();
}

// This code pulls the losers from from the 
// Beta campaign using the same criteria as before.
function addLosersToBetaGroup() {
  var loserResults = pullSearchQueryPerfReport(
    REPORT_TIMEFRAME,
    REPORT_COLUMNS,
    LOSING_CRITERIA
  );
  if(loserResults.length > 0) {
    var campKwHash = transformSearchQueryResults(loserResults);
    var campaignNames = Object.keys(campKwHash);
    // Find all the Beta campaigns
    var campIter = AdWordsApp.campaigns().withCondition("Name CONTAINS '"+BETA_SUFFIX+"'").get();
    while(campIter.hasNext()) {
      var camp = campIter.next();
      var campName = camp.getName();
      // If the campaign is in the list of Beta campaigns we need
      // to add negative to
      if(campaignNames.indexOf(camp.getName()) >= 0) {
        var negativesList = campKwHash[campName];
        for(var i in negativesList) {
          // Add the negatives.
          camp.createNegativeKeyword(negativesList[i]);
        }
      }
    }
  }
}

// This function transforms the data from the Search Query report
// into a map of { campaignName : [ "[query1]","[query2]", ... ] }
function transformSearchQueryResults(results) {
  var campKwHash = {};
  var campColumn = REPORT_COLUMNS.indexOf('CampaignName');
  var queryColumn = REPORT_COLUMNS.indexOf('Query');
  for(var i in loserResults) {
    var row = loserResults[i];
    var campName = row[campColumn];
    var query = row[queryColumn];
    if(!campKwHash[campName]) {
      campKwHash[campName] = [];
    }
    campKwHash[campName].push('['+query+']');
  }
  return campKwHash;
}

 

Protecting Your Alpha Queries

The last aspect of the Alpha Beta Campaign structure we can automate is making sure your Alpha campaigns are protected. We don’t want those exact match Alpha keywords you worked so hard on optimizing showing up in any of our Beta campaigns.

This script can run independently of our previous script. It will go through all of your Alpha Campaigns and automatically add any new keywords it finds as exact match negatives to the corresponding Beta campaign. You can schedule this script to run hourly on your account, so that your Alpha and Beta campaigns will never be out of sync.

/*******************************
 * Automatically add any new keywords in your
 * Alpha campaigns as exact match negatives in
 * the corresponding Beta campaign.
 *******************************/
// Just as before, these strings will be
// used to identify your Alpha and Beta campaigns.
// This script assumes that your Alpha campaigns are
// named "Campaign Name | Alpha" with the corresponding
// Beta campaign named "Campaign Name | Beta"
var ALPHA_SUFFIX = '| Alpha';
var BETA_SUFFIX = '| Beta';

function main() {
  var results = getKeywordReport();
  var toUpdate = {};
  for(var key in results) {
    var campData = results[key];
    for(var i in campData.alpha.keywords) {
      var kw = campData.alpha.keywords[i];
      if(campData.beta.negatives.indexOf(kw) == -1) {
        if(!toUpdate[campData.beta.campName]) {
          toUpdate[campData.beta.campName] = [];
        }
        toUpdate[campData.beta.campName].push(kw);
      }
    }
  }
  var campIter = AdWordsApp.campaigns().withCondition("Name CONTAINS '"+BETA_SUFFIX+"'").get();
  while(campIter.hasNext()) {
    var betaCamp = campIter.next();
    var betaCampName = betaCamp.getName();
    if(toUpdate[betaCampName]) {
      var negativesToAdd = toUpdate[betaCampName];
      for(var i in negativesToAdd) {
        betaCamp.createNegativeKeyword('['+negativesToAdd[i]+']');
      }
    }
  }
}

// This function uses the Keywords report and
// the campaign negatives report to build a list
// of the keywords and negatives in each campaign.
function getKeywordReport() {
  var columns = ['CampaignName','Criteria','IsNegative'];
  var reportQueryTemplate = "SELECT %s FROM %s "+
                            "WHERE IsNegative IN [true,false] "+
                            "AND CampaignName CONTAINS '%s' ";
  var alphaReportQuery = Utilities.formatString(reportQueryTemplate, 
                                                columns.join(','), 
                                                'KEYWORDS_PERFORMANCE_REPORT',
                                                ALPHA_SUFFIX);
  var betaReportQuery = Utilities.formatString(reportQueryTemplate, 
                                               columns.join(','), 
                                               'CAMPAIGN_NEGATIVE_KEYWORDS_PERFORMANCE_REPORT',
                                               BETA_SUFFIX);
  var queries = [alphaReportQuery,betaReportQuery];
  var results = {};
  for(var i in queries) {
    var reportIter = AdWordsApp.report(queries[i],{
      includeZeroImpressions: true
    }).rows();
    while(reportIter.hasNext()) {
      var row = reportIter.next();
      if(row.CampaignName.indexOf(ALPHA_SUFFIX) == -1 &&
         row.CampaignName.indexOf(BETA_SUFFIX) == -1) {
        continue;
      }
      var campType = (row.CampaignName.indexOf(ALPHA_SUFFIX) >= 0) ? 'alpha' : 'beta';
      
      var cleanCampName = row.CampaignName.split(ALPHA_SUFFIX)[0];
      cleanCampName = cleanCampName.split(BETA_SUFFIX)[0];
      
      if(!results[cleanCampName]) {
        results[cleanCampName] = {
          alpha: { keywords: [], negatives: [], campName: '' },
          beta:  { keywords: [], negatives: [], campName: '' }
        };
      }
      results[cleanCampName][campType].campName = row.CampaignName;
      if(row.IsNegative == 'true') {
        results[cleanCampName][campType].negatives.push(row.Criteria);
      } else {
        results[cleanCampName][campType].keywords.push(row.Criteria);
      }
    }
  }
  return results;
}

 

Wrapping Things Up

So once you have these scripts up and running in your Alpha Beta accounts, all that’s left for you to do is focus on making sure your Alpha campaigns are the best they can be. The reporting and negatives should be taken care of.

Of course, you should always pay careful attention to what your scripts are doing and audit them on a regular basis to make sure things are still working correctly. Anything that makes changes to your account should be previewed many times before you run it on a regular basis. It might even be a good idea to separate these into three scripts, so you can run and test them as needed.

The post Automate Alpha Beta Campaign Structure Using AdWords Scripts appeared first on Search Engine Land.

Source: SEland

Data On My Google Panda 4.2 Recovery

I initially shared some statistics on my Google Panda 4.2 recovery. As you know, this site was hit by the Panda 4.1. But there is clear evidence things are improving since 4.2.

Here are some charts, unedited, from Google Analytics. I filtered the source to show on Google organic traffic. I added some lines so you can see the trends.

click for full size

Let’s compare it to an average 10-day period during my Panda 4.1 penalty. The orange line is from when I was penalized, the blue is after Panda 4.2 ran and you can see, the slow roll out is slow. The past couple days have really shown an uptick in organic Google traffic:

click for full size

But how are things going from before Panda 4.1 (before penalty) to after Panda 4.2 (after penalty). As you can see the gap is getting smaller and smaller, there is plenty of room to grow but hopefully as the new Panda scores hit all my pages, recovery will come back in line with what it was before Panda 4.1 hit this site. Orange is before Panda 4.1, blue is after Panda 4.2:

click for full size

Forum discussion continued at WebmasterWorld, Google+ and Twitter.


Source: SEroundTable