Steve Jobs Never Did Market Research. Yes he did.

We’ll discuss if Steve Jobs never did market research a bit later. First though, Michael Schrage has written a good book: Who Do You Want Your Customers to Become? I’ve been sending everyone, even tangentially related to marketing, links to the book. It is thought-provoking, but after getting back a few emails about it, I realized the book is a bit misunderstood.

At first read (with the hope that this will be magic bullet that will drive sales to astronomical heights), the premise seems to be that businesses should decide what they want customers to be (the transformation), align sales, marketing, and operations departments, and the transactions will flow. The business will tell the customer what they need and the customer will eat it up. 

Clearly that is not how it works. 

What gets overlooked is that customer transformation can only happen if there is alignment with the customers desires. You can’t sell them something they don’t want or need at some level mentally. Customers will buy products or services that improve their lives in some way (real or imagined). Transforming a customer is really aligning what the customer wants to be, with solutions provided by a business. 

Let’s look at some of the examples Schrage provides in the book. Disney had spent decades creating movies princess-type characters. Disney’s customers wanted to grow up to be princesses. Disney wanted their customers to be princesses. Disney packaged their existing movie characters as princesses, promoted them as princesses, and then sold princess-related products. Disney was offering them ways to be a princess. Alignment of business and customers. $$$$$$$$.

The key in transforming customer expectation is identifying what essential attribute your service cultivates in the customer. How does it make the customers life better?

Alignment does not just have to aspirational. Google has been the technical wiz kids of the Internet for 15 years now. They figured out how to make searches faster and better, which changed the customers expectations of how search should work. But customers always wanted faster and better search. Alignment. Win.

Facebook made sharing and connecting people so easy and useful (in terms of feedback from friends), it changed everyone’s expectations of how we communicate and what we wanted to communicate. But it still stems from the fact that people want to share and we are nosey about the lives of our friends.

Shrage points out that Apple and Starbucks tapped into people wanting to be connoisseurs (either for real or status). For Apple, a shiny, sleek, well designed product. For Starbucks, coffee (or a drink with a bit of coffee and lots of milk, lol). We want to be hipsters with the pretty devices and hang out in cool places. 

Back to Steve Jobs never did market research. The thing is, Apple did research. The research subjects were initially Jobs and Woz (skip to 2:20 in video above). They built the original Apple machines that they wanted to build and use. And afterwards, products that Apple folks wanted to use themselves. 

Most companies are not in a position to use their products so thoroughly internally that they can be experts in knowing what their customers want. The nature of certain industries makes this feasible for some companies. Electronics and fashion come to mind. But if a company is not in such an industry, they have to pony up resources to understand their current and potential customers.


tl;dr - do research and figure out what your customers want and then give it to them.

Influence Marketing and Dyadic Relationships

Danny Brown has an excellent article on how everyone could do a better job measuring influence marketing.

The important thing to remember is that even after identifying and reaching out to influencers, we still have to track it with our normal processes. The sales cycle still has to be enforced. Tracking lead generation, tracking where they are coming from, pushing it all into CRM, and nurturing…and then doing the calculations to see how effectiveness of the channel.

I had a coworker years ago who went to work for BzzAgent. Find key influencers, get them to pitch products in-person (in a nice non-creepy way). They thought the same thing as Danny, influence is at a dyadic level, not just a matter of splattering ads all over Facebook.

Similarly, take a look at the NY Times article on how the Obama campaign found who to target. Ignore the politics, but it was basically dyadic relationships too. “We asked to see [Facebook] photos but really we were looking for who were tagged in photos with you”. That is how they identified voters, attributes, and how to target them”.

Eventually, none of this is cheaper or that different from any other channel.

BTW, checkout a preview of Danny Brown’s book: Influence Marketing: How to Create, Manage, and Measure Brand Influencers in Social Media Marketing

What is B2B Inbound Marketing

Basically, this is about what is B2B inbound marketing and how it isn’t the savior of your business.

What exactly is B2B inbound marketing? Essentially putting your products and services out there, so prospects will find you.

Outbound marketing is more of the push type. It’s more the get in your face style. Billboard, newspaper ads, direct mail, essentially advertising that you can’t escape from.

What is B2B Inbound Marketing

Everybody wants to do B2B inbound marketing nowadays. You would think that it is the golden goose for increasing sales. Marketers tend to think that will reduce cost and drive up revenue quickly (they thought social media was the answer as well).

While B2B inbound marketing can reduce some costs, it still needs to be part of a total marketing strategy, a strategy that has inbound and outbound marketing components.

It’s important to understand that prospects will be at different stages of the buying cycle. They could be looking to see how others are dealing with a particular problem. They could be looking simply researching options, figuring out how to budget for the next fiscal year. Therefore, it’s not an end-to-end solution. It can help bring prospects into the funnel, help show off your expertise, but it’s not going to close the deal for you. I say with the caveat that it really depends on the industry. For complex sales, which includes most of B2B, this holds true.

Let’ touch on the basic premise of B2B inbound marketing: it’s all about content. If your company cannot devise a plan to create content, inbound marketing will not work. The point of the content is to show off your products and services. Your expertise. There are lots of different formats for this: blogging, news articles, ebooks, case studies, demos, webinars, infographics, online training, technical specs, white papers, videos, and much more. This is a lot of content to produce. Of course, you don’t have to do it all.

In fact, before you even start coming up with a B2B inbound marketing plan, you have to understand your target audience. Where are they? Are they on the web researching? Are they on social networks? Are emails a good way of reaching them? Certain industries are not very open to inbound marketing. They might be laggards in terms of technology, or IT policies prevent them from researching at the office. Without proper segmentation of the target audience, inbound marketing will be a waste of time, and more importantly, money.

This brings to other problems with B2B inbound marketing. Folks who are researching for your solutions may not be the decision makers. Maybe there is a committee that will decide on the purchase. Maybe their boss actually controls the purse strings and has to sign off.

But here is where marketing automation is a huge help. Marketing automation is using technologies to move prospects along in the funnel and converting them to actual buyers. It’s about lead nurturing. It’s about building a relationship with the prospect. Marketing automation allows a business to touch the prospect multiple times in meaningful ways, to keep them engaged and educated, until they buy or move on. Platforms like Marketo and Pardot that specialize in automation are quite sophisticated. The core concept here is scoring leads by looking at what content prospects are consuming, combined with how much time they have spent on your material, and figuring out if they are ready to be handed over to your sales team, so the prospected can be contacted.

So lets summarize what you should do:

  • Segment target audience: Are they online? Are they on particular online blogs/communities or social networks?
  • B2B Inbound marketing: News releases, blogging, social media, online communities (like forums), publishing white papers/ebooks, videos (testimonials, how you build your product), case studies, webinars, product data sheets, and SEO.
  • Lead nurturing and scoring: Are they consuming your content? How much? Where in the buying cycle are they currently? Are they ready to buy? How do you move them along? How can you engage them? What information would help them?
  • B2B Outbound marketing: traditional offline campaigns (tradeshows, print ads, direct mail), online campaigns (banner/display ads, sponsored newsletters and emails).
It is great to be in marketing nowadays. Lots of different avenues, meaning lots of opportunities. And lots of opportunities for you to do it better than your competitors.

How to Flash / Install Ubuntu Touch on Galaxy Nexus from Mac OS X

ubuntu-touch-preview-on-galaxy-nexus-smaller

These are instructions for how to flash / install Ubuntu Touch on a Galaxy Nexus GSM from Mac OS X.

If you brick your Galaxy Nexus by following these instructions, its your fault. Don’t do this if you are a noob or never installed a custom ROM. Consider yourself warned.

Pre-requisite: Unlock your phone. Google it.

  • Download the following files from http://cdimage.ubuntu.com/ubuntu-touch-preview/quantal/mwc-demo: quantal-preinstalled-phablet-armhf.zip, quantal-preinstalled-recovery-armel+maguro.img, and quantal-preinstalled-armel+maguro.zip.
  • Download the Android SDK
  • Unzip the SDK.
  • Open up Terminal.
  • cd into adt-bundle-mac-x86_64/sdk/platform-tools
  • (Optional: move the above downloaded files into the platform-tools directory or just specify the location of the files below)
  • Turn off the phone.
  • Boot into bootloader (as in press down both Volume up/down and power for a couple seconds).
  • Back in the Terminal, type:
./fastboot flash recovery quantal-preinstalled-recovery-armel+maguro.img



Looks like this installs a version of ClockworkMod Recovery.

  • Reboot back into the bootloader by clicking on Volume Up or Down till you see ‘Restart bootloader’ and clicking on Power.
  • Go into Recovery Mode by clicking the Volume Up/Down button a couple of times till you see Recovery Mode. Then click the Power button.
  • Back in the Terminal:
./adb push quantal-preinstalled-phablet-armhf.zip /sdcard/0/Download/quantal-preinstalled-phablet-armhf.zip



And then:

./adb push quantal-preinstalled-armel+maguro.zip /sdcard/0/Download/quantal-preinstalled-armel+maguro.zip



The sdcard is referring to the internal storage, not a separate SD card (which the Galaxy Nexus doesn’t support anyway).

  • Select ‘install zip from sdcard’ (use Volume keys to scroll and Power to select)
  • Select ‘choose file from sdcard’
  • Go into /sdcard/0/Download.
  • Select quantal-preinstalled-phablet-armhf.zip.
  • Scroll to ‘Yes - Install…’ and select it. The zip will get installed.
  • Select ‘choose file from sdcard’
  • Go into /sdcard/0/Download.
  • Select quantal-preinstalled-armel+maguro.zip.
  • Scroll to ‘Yes - Install…’ and select it. The zip will get installed.
  • Select ‘+++++Go Back+++++’ a few times to go back.
  • Select ‘reboot system now’

Have fun.

G+

How to do a Jawbone Icon Hard Reset



With a new Galaxy Nexus, I couldn’t pair my bluetooth headset with it. Seemed like I needed to reset it. So here are instructions on how to reset the Jawbone Icon:

  • Turn it on
  • Wait for white blinking light.
  • Very quickly, click the talk button 6 times
  • Wait for white blinking light to blink red.
  • Hold down the talk button.

When it flashes red and white alternately, the Jawbone Icon is done resetting.

Galaxy Nexus + Straight Talk + AT&T + MMS APN Settings



If you are using a Galaxy Nexus on Straight Talk with a AT&T provisioned SIM card and having issues with sending and receiving MMS, here are the APN settings that should work for you.

The Galaxy Nexus that I bought through Google Play had a Cingular APN already on it. Delete it. Or at least write down the settings just in case everything breaks on you. And then delete it.

Add a new APN with exactly these entries:

  • Name: straight talk (or whatever you want it to be)
  • APN: att.mvno
  • Proxy: proxy.mvno.tracfone.com
  • Port: 80
  • Username: Not set
  • Password: Not set
  • Server: Not set
  • MMSC: http://mmsc.cingular.com
  • MMS proxy: 66.209.11.33
  • MMS port: 80
  • MCC: 310
  • MNC: 410
  • Authentication type: Not set
  • APN type: Not set
  • APN protocol: IPv4
  • APN enable/disable: APN enabled
  • Bearer: Unspecified

That should be it.

Database SQL Snippets

Database SQL Snippets

These are some of my frequently used bits of SQL.

Tested: MS SQL Server 2008 R2

List of all empty tables in SQL Server Database

EXEC sp_MSforeachtable ‘IF NOT EXISTS (SELECT 1 FROM ?) PRINT ”?” ‘



List of all tables with at least 1 row of data in SQL Server Database

EXEC sp_MSforeachtable ‘IF EXISTS (SELECT 1 FROM ?) PRINT ”?” ‘



Find latest modified stored procedures

SELECT name, create_date, modify_dateFROM sys.objects WHERE type = ‘P’ — Only stored proceduresorder by modify_date descGO

Change ‘P’ to ‘V’ if you want to search for views.

Find string in stored procedures

SELECT NameFROM sys.proceduresWHERE OBJECT_DEFINITION(OBJECT_ID) LIKE ‘%STRINGTOSEARCHFOR%’GO



Find all constraints

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint,SCHEMA_NAME(schema_id) AS SchemaName,OBJECT_NAME(parent_object_id) AS TableName,type_desc AS ConstraintTypeFROM sys.objectsWHERE type_desc LIKE ‘%CONSTRAINT’ order by NameofConstraintGO



Find all foreign keys

SELECT f.name AS ForeignKey,OBJECT_NAME(f.parent_object_id) AS TableName,COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ColumnName,OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,COL_NAME(fc.referenced_object_id,fc.referenced_column_id) AS ReferenceColumnNameFROM sys.foreign_keys AS fINNER JOIN sys.foreign_key_columns AS fcON f.OBJECT_ID = fc.constraint_object_id



image

iPad Pin It Pinterest Bookmarklet in Safari

iPad Pin It Pinterest Bookmarklet in Safari

It looks like Pinterest hasn’t provided a convenient way of adding the Pin It bookmarklet to Safari on the iPad. But try the instructions below. Its been tested with iOS 5.

Step 1Bookmark this page in Safari on the iPad. Give it a useful name like Pin It.

iPad Pin It Pinterest Bookmarklet in SafariiPad Pin It Pinterest Bookmarklet in SafariStep 2Copy the javascript below:

javascript:void((function(){var%20e=document.createElement(‘script’);e.setAttribute(‘type’,’text/javascript’);e.setAttribute(‘charset’,’UTF-8’);e.setAttribute(‘src’,’http://assets.pinterest.com/js/pinmarklet.js?r=’+Math.random()*99999999);document.body.appendChild(e)})());



iPad Pin It Pinterest Bookmarklet in SafariStep 3Go back and replace the bookmarklet address with the javascript above.

iPad Pin It Pinterest Bookmarklet in SafariStep 4Pin away!

iPad Pin It Pinterest Bookmarklet in SafariiPad Pin It Pinterest Bookmarklet in SafariiPad Pin It Pinterest Bookmarklet in SafariiPad Pin It Pinterest Bookmarklet in SafariFollow me on Pinterest.

Tweet me if the Pin It bookmarklet no longer works.

Magento 1.6: Fix Missing Submit Shipment Button

If you have installed Magento 1.6 or upgraded to Magento 1.6, and if you click on the Ship button on the order page in the back-end, the Submit Shipment button at the bottom right may be missing. Only an empty yellow box will be displayed.

To fix this, copy app/code/core/Mage/Sales/Model/Order.php to app/code/local/Mage/Sales/Model/Order.php (because you never, ever, want to be editing Magento core files). Open up the local Order.php, on line 1218-ish, you will find:

[code]$shippingMethod = parent::getShippingMethod();[/code]

Change it to:

[code]$shippingMethod = $this->getData(‘shipping_method’);[/code]

For possible reasons on why this is happening in the first place, see the Magento boards.

Fixing Contact Form 7 Redirection Referrer Failure with IE

On a client WordPress site, we wanted to use Contact Form 7 to grab visitor information and redirect them to an inner page after submission. To make sure they filled out the submission form, the destination page checked the referrer to make sure they came from the form page. Now, there are other ways of doing this, like setting cookies, but this method was good enough for the client.

So this all worked in Chrome and Firefox, but not Internet Explorer.

Shocking.

The Contact Form 7 blog has instructions on how to redirect users to a different page after a successful submission. Under Additional Settings, simply do this:

[code]on_sent_ok: “location=’http://www.fubar.com/thanks’;”[/code]

The on_sent_ok is a Javascript hook. Inside of scripts.js in the plugin, it eventually makes this call:

[code]if (data.onSentOk) $.each(data.onSentOk, function(i, n) { eval(n) });[/code]

So “location=’http://www.fubar.com/thanks’;” gets evaluated by Javascript and the page redirects. Great.

On the destination page, we were checking the referrer to verify they were coming from the form, here is an example of how you could do it:

[code]/* Set where they should be redirected to if user didn’t come from the form */$redirectString = “Location: “. get_site_url() . “/contactform”;

$referrer = $_SERVER[‘HTTP_REFERER’];

if ($referrer == NULL){ header($redirectString); exit();}else{ $domain = parse_url($referrer); $pos = strpos ($domain[“path”], “contactform”); if ($pos == false) { header($redirectString); exit(); }}[/code]

Now, your PHP should be cleaner, more error checking, check for XSS, don’t hard-code anything, etc, etc.

The problem was that the referrer would always be null when the visitor was using Internet Explorer. Referrer isn’t required to be set by the browser. Browsers won’t set it if you started out on a HTTPS site but click on a non-secure link.

And IE won’t set it on redirection, but it will set it if you click on a link. So if a fake a link click, IE will set the referrer.

Lets create a Javascript function to fake a link click. This code is stolen from Stack Overflow:

[code]function goTo(url){ var a = document.createElement(“a”); if (a.click) { // HTML5 browsers and IE support click() on <a>, early FF does not. a.setAttribute(“href”, url); a.style.display = “none”; document.body.appendChild(a); a.click(); } else { // Early FF can, however, use this usual method // where IE cannot with secure links. window.location = url; }}[/code]

Ok. Remember, the Contact Form 7 redirection is a Javascript hook. So now we change the on_sent_ok to call the goTo function instead:

[code]on_sent_ok: “goTo(‘http://www.fubar.com/thanks’);”[/code]

Bam. Done.

Magento + Prototype.js + New Window + PDF Links

Prototype.jsThis is relatively straightforward to do, but I’m posting it so I have the Javascript next time I need it. On a Magento client site, all PDFs needed to be opened in a new window. Why? No clue. The Magento template wasn’t doing anything fancy, it was simply using the standard Magento Prototype.js library. Not having used Prototype.js in a long time, it took me a while to figure out the function calls to set the target attribute on all PDFs links to _blank, but here it is:

[code]document.observe(“dom:loaded”, function() {

$$(‘a[href!=”“]’).each(function(link){ if(link.readAttribute(‘href’).toLowerCase().include(‘.pdf’)) { link.writeAttribute(‘target’,’_blank’); } });});[/code]

This is pretty much self-explanatory, but I’ll go through it anyway. document.observe(“dom:loaded”) is the jQuery equivalent of $(document).ready. readAttribute is like jQuery.attr(), include is like a Javascript IndexOf.

Thats pretty much it.

How to Fix Internet Explorer + iFrame + PNG Transparency Issue

Working on a client site, we ran into issues with Internet Explorer, iFrames, and transparent PNGs. For the site, we are using an iFrame to load content when the user clicks on a button. On the fly, with javascript, a bit of code gets generated like:

[code][/code]

Code snippel from fooFrame.html:

[code]

Blah, Blah, Blah


[/code]

[code]#bazImage {color: white;font-size: 16px;font-weight: bold;padding: 25px 30px 0px 18px;font-family: Arial, Helvetica, sans-serif;background: url(images/bazImage.png) no-repeat;width: 256px;height: 107px;}[/code]

The background image is bazImage.png, a transparent PNG. This worked fine in Chrome, Firefox, and Safari, but all the transparent pixels turned up as white in IE. My first thought was we needed to apply a PNG fix.

But that didn’t help.

Not so surprisingly, Internet Explorer handles transparency differently than other browsers. Elements have an allowTransparency attribute that defaults to false, so embedded iFrames won’t be transparent. Simply set it to true.

One final step, set ‘background-color: transparent;’ in the body element.

WordPress + Headway Themes: Remove RSS Feed Links

WordPress + Headway Themes: Remove RSS Feed LinksCurrently, this site is running WordPress MultiSite + Headway Themes. The main site is information I think other folks on the intertubes might find helpful. My Stream is generally junk that I find interesting. So, there is not one big RSS feed for the site. Don’t want the main site feed to get polluted by the stream feed.

I don’t know how many folks actually use auto RSS browser discovery, so I wanted to get rid of the RSS links that Headway makes automatically and replace it with a general RSS page that can be reached when the user clicks on the RSS icon.

So, lets see how Headway Themes adds feeds to the HTML. Towards the bottom of wp-content/themes/headway-version/library/core/head.php, you have Headway code being added to the standard WordPress header hook:

[code]add_action(‘wp_head’, ‘headway_head_extras’, 9);[/code]

Slightly higher up in head.php, the headway_head_extras function is defined and set as a hook itself:

[code]function headway_head_extras(){?>


Its important to notice that this bit of code has the feed and pingback URL. We do want to keep the pingback URL, so we’ll need to handle that.

To stop headway_head_extras from being called in general by the WordPress header, I did the following:[code]function my_headway_head_extras(){?>

Clear Cache Manually in CMS Made Simple: string(103) “Smarty error: [in template:20 line 3] [plugin] unknown tag

CMS Made SimpleAs a continuation of a project to move a CMS Made Simple site from one webhost to another, I ran into some caching issues.

Having successfully moved the CMS Made Simple files and database over, and editing the configuration file to use the right path and DB credentials, I went to the homepage. I was unceremoniously presented with:

string(103) “Smarty error: [in template:20 line 3]: [plugin] unknown tag - ‘title’ (core.load_plugins.php, line 124)” string(106) “Smarty error: [in template:20 line 4]: [plugin] unknown tag - ‘metadata’ (core.load_plugins.php, line 124)” string(108) “Smarty error: [in template:20 line 5]: [plugin] unknown tag - ‘stylesheet’ (core.load_plugins.php, line 124)” string(110) “Smarty error: [in template:20 line 6]: [plugin] unknown tag - ‘cms_selflink’ (core.load_plugins.php, line 124)” string(106) “Smarty error: [in template:20 line 43]: [plugin] unknown tag - ‘content’ (core.load_plugins.php, line 124)”


Nice.

Having never worked with a CMS Made Simple site before, this was really not helpful. My first assumption was that it was a caching issue. But I didn’t have the admin login information, so I couldn’t go into the backend and delete the cache. I would have to delete the cache manually.

When uploading the site, I noticed that there was a tmp directory. I imagined thats where the cache files would be located. Turns out I was right.

Deleting the contents of the tmp/cache and tmp/templates_c got rid of the nasty error and you can see the contents of those directories being refreshed once you hit the site.