Tag Archives: nigeria

3 Ways You Could be Unknowingly Wasting Ad Budget

Today’s ad platforms can have even the most experienced PPC marketers spending more than intended.

Campaign settings, rules and other factors change over time, which can have substantial impact on your campaigns. For example, starting October 4th, 2017 Google announced they could spend up to two times your daily budget. If you’d been sitting calm with $1,000/day budget, not wanting to spend a penny more, you could have been surprised.

There are many unpredictable reasons you can wind up with traffic or spend you didn’t plan for (and may not even know) — which is why it’s useful to consider intended vs. actual traffic.

Here’s what I mean:

  • Intended traffic: Is the traffic you planned on acquiring in your strategy as a result of the keywords, geographies, and networks you defined.
  • Actual traffic: Is traffic you actually get from your ad platforms, in spite of your strategy. Sometimes you’ll see traffic that was not intended due to campaign settings, mistakes or platform changes.

In short, the gap between intended and actual traffic is wasted ad budget. But, fortunately, you can identify and fix this to save money.

are you wasting ad budget?
Wasted budget is like wasting pizza, only worse. (via Giphy)

In this post I’ll cover three ways you might be wasting your PPC spend and how to ensure you’re both aware, and can turn things around with quick fixes.

Mistake 1. Accidentally spending on bad search terms

Wasted budget on the wrong keywords is fairly common. As Melissa Mackey of B2B agency Gyro sees often:

“advertisers [bid] on keywords that they shouldn’t be bidding on. For example, novice advertisers selling shoes try to bid on ‘shoes.’ Overly broad keywords eat up budget and do not perform well for the advertiser.”

But the bigger problem here is that some marketers believe that keywords and search terms are the same thing. The terms are commonly used interchangeably, but they’re very different. Here’s how I define each:

  • What’s a search term? This is the exact word or phrase a person uses on the search engine to find what they were looking for (how buyers search). See the “Search Term” column in the example below.
  • What is a keyword? This is the word you use to target search terms on paid search platforms (how marketers target buyers). See the “Keyword” column in the example below.

If you misunderstand or accidentally misapply keyword match types (broad, broad modified, phrase, exact match), you can have a gap between search terms and keywords causing you to spend unknowingly.

For example, a client in the continued medical education space was targeting medical professionals who need Pediatric Advanced Life Support (PALS) certification. Here’s what happened:

  • Intended traffic in this case included people searching ‘Pediatric Advanced Life Support’ or ‘PALS certification’.
  • Actual traffic ended up including Pediatric Advanced Life Support certification and PALS certification. However, because of poor keyword match types (and the acronym in this case), the company ended up with traffic from search terms such as “penpals online,” “free kids online pen pals,” and “senior pen pals.”

See the Search Terms Report as an example:

Click above to see larger image of how intended medical certification traffic turned into pen pals traffic (via SCUBE Marketing).

Traffic that attracted anyone looking for “pen pals” wasn’t intended, leading to wasted spend. The root cause of this was confusion over the difference between search terms, keywords, and their match types.

Action item: Take a closer look at search terms

To avoid this scenario yourself, run a Search Term report discussed above to identify which search terms (triggered by your keywords) are not relevant.

Then exclude irrelevant terms with negative keywords at ad group, campaign, or account level. From there, use keyword match types to better control your exclusions. For example:

  • Exact Match Negative to exclude just the exact term that was irrelevant. Example: -[penpals online]
  • Phrase Match Negative to exclude an irrelevant phrase pattern you noticed in your search terms. Example: -“penpals online”, which will exclude ‘California penpals online’, ‘penpals online’, and ‘penpals online for seniors’.
  • Broad Match Negative to exclude search terms containing irrelevant words. Example: -penpals, which will automatically exclude all search terms with penpals.

Once you’ve eliminated any obvious waste, reevaluate your keyword match type strategy. If you skip this step, you will continue to trigger lots of irrelevant search terms.

Your match types will range from exact match (with a close correlation), to broad match (with far correlation) between your keywords and search terms.

Ideally, break your broad match keywords into more specific keywords with broad match modified, phrase or exact match types. They will give you more control and trigger search terms you intend to target.

Mistake 2. Wasting spend on unintended locations

Similar to keyword match types, incorrect location settings in AdWords can trigger ads in locations you don’t want to serve and amount to wasted budget.

When we look at the reality of the situation, your location settings can trigger three types of geographies:

  1. Physical location. Your ads appear to people physically located in your target geography. This is the option we usually expect when selecting locations to target, in that it’s very direct. This is our intended traffic insofar as geography.
  2. Location of interest. Your ads appear to people searching for (or indicating interest in) your targeted location. With this option, physical location doesn’t matter. As long as people have your target location in their search terms, the ad is triggered. This can result in out-of-country traffic that appears to be relevant, but perhaps isn’t for a myriad of reasons. (i.e. Perhaps you don’t ship to a given location, for example and your ads would thereby be irrelevant to those in that area).
  3. Both. This setting combines both targeting options. Your ads appear to people who are physically located in your target geography, or are searching for (or indicating interest in) your targeted location. This is the broadest option.

To see how you can waste spend this way, here’s an example of how unintended location targeting affected a client in the industrial machinery space:

With respect to intended traffic, this client wanted to target people physically located in the United States. However, they ended up with traffic from Nigeria, India, Canada, United Kingdom, Mexico, and the Philippines. Unfortunately, the client doesn’t do business internationally, so their budget was spent on targeting the wrong locations.

In this case, the client kept the default AdWords setting of ‘Both’, which triggered the traffic from physical location and location of interest, causing the unintended international traffic. Fairly simple mistake to make.

Action item: Stop Wasted Ad Budget on Unintended Locations

Get a list of locations where your ads have triggered by running the User Locations Report in AdWords. See an example below with multiple unintended international locations for the same client I described above.

Incorrect Location Settings causing wasted ad budget
Click above to see a larger, clearer image.(via SCUBE Marketing)

Once identified, exclude irrelevant locations from within your campaign settings. After your locations have been excluded they will appear next to targeted locations. See an example below.

Exclude Locations In Campaign Settings To Stop Wasting Ad Budget
Exclude locations in campaign settings to stop wasting ad budget

Once you have identified any unintended locations, check how these locations were triggered by reviewing a Geographic Report. In our example, the ‘location of interest’ setting caused the traffic the client did not want.

Location of Interest Targeting Setting
Click above to see a larger, clearer image.

To avoid this, simply change the setting to ‘people in my targeted location’:

Mistake 3. Using the default regarding unintended networks

Network targeting has similar quirks as location targeting. The devil is in the details and wasted budget often lies in the settings. AdWords has different campaign types. If you’re not careful, and you stick with the default settings, your targeting can (and probably will) be off.

To clarify, here’s an example from the intended vs. actual traffic angle for a new client we audited recently.

They’d wanted to target people using Google Search on Google.com, but ended up with traffic from the Search Network, Search Partners Network, and Display Network. Obviously this was unintended, and they didn’t know. As it turns out, they didn’t execute their targeting properly and their campaign settings had a default setting: ‘Search Network with Display Select’.

Click above to see larger image of default campaign network settings you may want to avoid (via SCUBE Marketing).

This resulted in the client targeting three unintended networks in one campaign. Prepared only for the Search, they didn’t have targeting and ads for Display, and ended up with automatic placements from irrelevant websites. Overall, 53% of their PPC budget went to the Search Partners Network and Display, but the traffic had zero conversions, and was a waste.

Click above to see larger image of Surprise Traffic Coming From Search Partners and Google Display Network (via SCUBE Marketing).
Action item: Stop Wasted Ad Budget on Unintended Networks.

How can you check if you are unintentionally targeting networks without your knowledge?

Segment your campaigns by network. See an example below. Once segmented, you can figure out the right settings, and can plan the action items for further optimization.

If you see traffic from unintended networks, simply change your network settings from the default.

Don’t drain your ad budget

Because of fine details, even the best marketers can fall into traps and overspend unintentionally. Paid campaigns can be difficult beasts to manage, and a campaign that hasn’t been optimized to eliminate waste is a ship with leaks in it, destined to sink.

Take a good look at your data for the above, scrub it against what you’ve learned here today, and see what you can save.

View original article – 

3 Ways You Could be Unknowingly Wasting Ad Budget


Obfuscating Blacklisted Words In WordPress With ROT13

Countless algorithms for encrypting data exist in computer science. One of the lesser known and less common encryptions is ROT13, a derivative of the Caesar cypher1 encryption technique.

In this tutorial, we’ll learn about ROT13 encryption and how it works. We’ll see how text (or strings) can be programmatically encoded in ROT13 using PHP. Finally, we’ll code a WordPress plugin that scans a post for blacklisted words and replaces any in ROT13 encryption.

If you own a blog on which multiple authors or certain group of people have the privilege of publishing posts, then a plugin that encrypts or totally removes inappropriate words might come in handy


ROT13 (short for “rotate by 13 places,” sometimes abbreviated as ROT-13) is a simple encryption technique for English that replaces each letter with the one 13 places forward or back along the alphabet. So, A becomes N, B becomes O and so on up to M, which becomes Z. Then, the sequence continues at the beginning of the alphabet: N becomes A, O becomes B and so on up to Z, which becomes M.

A major advantage of ROT13 over other rot(N) techniques (where “N” is an integer that denotes the number of places down the alphabet in a Caesar cypher encryption) is that it is “self-inverse,” meaning that the same algorithm is applied to encrypt and decrypt data.

Below is a ROT13 table for easy reference.

| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
| N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C | D | E | F | G | H | I | J | K | L | M |

If we encrypted the domain smashingmagazine.com in ROT13, the result would be fznfuvatzntnmvar.pbz, and the sentence “Why did the chicken cross the road?” would become “Jul qvq gur puvpxra pebff gur ebnq?”

Note that only letters in the alphabet are affected by ROT13. Numbers, symbols, white space and all other characters are left unchanged.

Transforming Strings To ROT13 In PHP

PHP includes a function, str_rot13(), for converting a string to its ROT13-encoded value. To encode text in ROT13 using this function, pass the text as an argument to the function.


echo str_rot13('smashingmagazine.com'); // fznfuvatzntnmvar.pbz

echo str_rot13('The best web design and development blog'); // Gur orfg jro qrfvta naq qrirybczrag oybt

Using ROT13 In WordPress

Armed with this knowledge, I thought of ways it might be handy in WordPress. I ended up creating a plugin that encodes blacklisted words found in posts using ROT13.

The plugin consists of a textearea field (located in the plugin’s settings page) in which you input blacklisted words, which are then saved to the database for later reuse in WordPress posts.

Without further fussing, let’s start coding the plugin.

Setting Up the Plugin

First, include the plugin’s file header2.


Plugin Name: Rot13 Words Blacklist
Plugin URI: http://smashingmagazine.com/
Description: A simple plugin that detects and encrypts blacklisted words in ROT13
Version: 1.0
Author: Agbonghama Collins
Author URI: http://w3guy.com
Text Domain: rot13
Domain Path: /lang/
License: GPL2

As mentioned, the plugin will have a settings page with a textarea field that collects and saves blacklisted words to WordPress’ database (specifically the options table).

Below is a screenshot of what the plugin’s settings (or admin) page will look like.

Settings page of the plugin.3
(See large version4)

Now that we know what the options page will look like, let’s build it using WordPress’ Settings API5

Building the Settings Page

First, we create a submenu item in the main “Settings” menu by using add_options_page(), with its parent function hooked to admin_menu action.

add_action( 'admin_menu', 'rot13_plugin_menu' );

 * Add submenu to main Settings menu
function rot13_plugin_menu() 
		__( 'Rot13 Blacklisted Words', 'rot13' ),
		__( 'Rot13 Blacklisted Words', 'rot13' ),

The fifth parameter of add_options_page() is the function’s name (rot13_plugin_settings_page), which is called to output the contents of the page.

Below is the code for rot13_plugin_settings_page().

 * Output the contents of the settings page.
function rot13_plugin_settings_page() 
	echo '<div class="wrap">';
	echo '<h2>', __( 'Rot13 Blacklisted Words', 'rot13' ), '</h2>';
	echo '<form action="options.php" method="post">';
	do_settings_sections( 'rot13-words-blacklist' );
	settings_fields( 'rot13_settings_group' );

Next, we add a new section to the “Settings” page with add_settings_section(). The textarea field we mentioned earlier will be added to this section with add_settings_field(). Finally, the settings are registered with register_setting().

Below is the code for add_settings_section(), add_settings_field() and register_setting().

	// Add the section

	// Add the textarea field to the section.
		__( 'Blacklisted words', 'rot13' ),

	// Register our setting so that $_POST handling is done for us
	register_setting( 'rot13_settings_group', 'rot13_plugin_option', 'sanitize_text_field' );

The three functions above must be enclosed in a function and hooked to the admin_init action, like so:

 * Hook the Settings API to 'admin_init' action
function rot13_settings_api_init() 
	// Add the section

	// Add the textarea field to the section
		__( 'Blacklisted words', 'rot13' ),

	// Register our setting so that $_POST handling is done for us
	register_setting( 'rot13_settings_group', 'rot13_plugin_option', 'sanitize_text_field' );

add_action( 'admin_init', 'rot13_settings_api_init' );

Lest I forget, here is the code for the rot13_setting_callback_function() and rot13_setting_section_callback_function() functions, which will output the textarea field and the description of the field (at the top of the section), respectively.

 * Add a description of the field to the top of the section
function rot13_setting_section_callback_function() 
	echo '<p>' . __( 'Enter a list of words to blacklist, separated by commas (,)', 'rot13' ) . '</p>';

 * Callback function to output the textarea form field
function rot13_setting_callback_function() 
	echo '<textarea rows="10" cols="60" name="rot13_plugin_option" class="code">' . esc_textarea( get_option( 'rot13_plugin_option' ) ) . '</textarea>';

At this point, we are done building the settings page for the plugin.

Up next is getting the plugin to detect blacklisted words and encrypt them with ROT13.

Detecting Blacklisted Words and Encrypting in ROT13

Here is an overview of how we will detect blacklisted words in a WordPress post:

  • A post’s contents are broken down into individual words and saved to an array ($post_words).
  • The blacklisted words that were saved by the plugin to the database are retrieved. They, too, are broken down into individual words and saved to an array ($blacklisted_words).
  • We iterate over the $post_words arrays and check for any word that is on the blacklist.
  • If a blacklisted word is found, then str_rot13() encodes it in ROT13.

It’s time to create the PHP function (rot13_filter_post_content()) that filters the contents of a post and then actually detects blacklisted words and encrypts them in ROT13.

Below is the code for the post’s filter.

 * Encrypt every blacklisted word in ROT13
 * @param $content string post content to filter
 * @return string
function rot13_filter_post_content( $content ) 

	// Get the words marked as blacklisted by the plugin
	$blacklisted_words = esc_textarea( get_option( 'rot13_plugin_option' ) );

    // If no blacklisted word are defined, return the post's content.
	if ( empty( $blacklisted_words ) ) 
		return $content;


		// Ensure we are dealing with "posts", not "pages" or any other content type.
		if ( is_singular( 'post' ) ) 

			// Confine each word in a post to an array
			$post_words = preg_split( "/b/", $content );

			// Break down the post's contents into individual words
			$blacklisted_words = explode( ',', $blacklisted_words );

			// Remove any leading or trailing white space
			$blacklisted_words = array_map(
				function ( $arg ) 
					return trim( $arg );


			// Iterate over the array of words in the post
			foreach ( $post_words as $key => $value ) 

				// Iterate over the array of blacklisted words
				foreach ( $blacklisted_words as $words ) 

					// Compare the words, being case-insensitive
					if ( strcasecmp( $post_words[ $key ], $words ) == 0 ) 

						// Encrypt any blacklisted word
						$post_words[ $key ] = '<del>' . str_rot13( $value ) . '</del>';

			// Convert the individual words in the post back into a string or text
			$content = implode( '', $post_words );

		return $content;

add_filter( 'the_content', 'rot13_filter_post_content' );

While the code above for the filter function is quite easy to understand, especially because it is so heavily commented, I’ll explain a bit more anyway.

The is_singular( 'post' ) conditional tag ensures that we are dealing with a post, and not a page or any other content type.

With preg_split(), we are breaking down the post’s contents into individual words and saving them as an array by searching for the RegEx pattern b, which matches word boundaries6.

The list of blacklisted words is retrieved from the database using get_option(), with rot13_plugin_option as the option’s name.

From the screenshot of the plugin’s settings page above and the description of the textarea field, we can see that the blacklisted words are separated by commas, our delimiter. The explode PHP function breaks down the blacklisted words into an array by searching for those commas.

A closure7 is applied to the $blacklisted_words array via array_map() that will trim leading and trailing white spaces from the array values (the individual blacklisted words).

The foreach construct iterates over the post’s words and check whether any word is in the array of blacklisted words. Any blacklisted word that gets detected is encrypted in ROT13 and enclosed in a <del> tag.

The $post_words array is converted back to a string or text and subsequently returned.

Finally, the function is hooked to the the_content filter action.

Below is a screenshot of a post with the words “love” and “forever” blacklisted.

A post with the blacklisted word love encoded in ROT138

Wrapping Up

ROT13 is a simple encryption technique that can be easily decrypted. Thus, you should never use it for serious data encryption.

Even if you don’t end up using the plugin, the concepts you’ve learned in creating it can be applied to many situations, such as obfuscating or encrypting inappropriate words (such as profanities) in ROT13, which would be a nice feature in a forum where people have the freedom to post anything.

Hopefully, you have learned a thing or two from this tutorial. If you have any question or a contribution, please let us know in the comments.

(dp, al, il)

Front page image credit: Wikipedia9.


  1. 1 http://en.wikipedia.org/wiki/Caesar_cipher
  2. 2 http://codex.wordpress.org/File_Header
  3. 3 http://www.smashingmagazine.com/wp-content/uploads/2014/12/rot13-plugin-settings-page-large-opt.jpg
  4. 4 http://www.smashingmagazine.com/wp-content/uploads/2014/12/rot13-plugin-settings-page-large-opt.jpg
  5. 5 http://codex.wordpress.org/Settings_API
  6. 6 http://www.regular-expressions.info/wordboundaries.html
  7. 7 php.net/manual/en/functions.anonymous.php
  8. 8 http://www.smashingmagazine.com/wp-content/uploads/2014/11/post-with-blacklisted-word-opt.jpg
  9. 9 http://en.wikipedia.org/wiki/Caesar_cipher

The post Obfuscating Blacklisted Words In WordPress With ROT13 appeared first on Smashing Magazine.

View this article – 

Obfuscating Blacklisted Words In WordPress With ROT13

Converting Our Stories Into Multi-Screen Experiences

Storytelling takes many forms. In the past, stories were told orally, with people telling and retelling myths, fables and even histories. As writing technology became more prevalent, we began to record our stories, and we told them in the pages of books. Now, our society is awash in different devices and technologies, and those traditions of spoken stories and printed stories are blurring.
Multi-screen narratives are being told across all kinds of platforms, pages and devices, making for truly immersive experiences.

Read original article – 

Converting Our Stories Into Multi-Screen Experiences

A Look Inside Smashing Magazine

Today is the day when it all started — the day when this little website launched back in 2006. We are celebrating our six-year anniversary party, and you, being the ones who made the website possible and kept us going, are our special guests. We couldn’t possibly have a party without you!
But who are we? Who are the people working behind the scenes to make Smashing Magazine truly smashing?

Continue reading: 

A Look Inside Smashing Magazine