{"id":873,"date":"2015-08-07T12:17:16","date_gmt":"2015-08-07T10:17:16","guid":{"rendered":"http:\/\/borkedcode.com\/wp\/?p=873"},"modified":"2015-08-07T12:17:16","modified_gmt":"2015-08-07T10:17:16","slug":"geoip-is-not-acceptable","status":"publish","type":"post","link":"https:\/\/www.borkedcode.com\/wp2\/2015\/08\/07\/geoip-is-not-acceptable\/","title":{"rendered":"GeoIP is NOT acceptable"},"content":{"rendered":"<p>Hi all.<\/p>\n<p>Forgive the incendiary headline. \u00a0I do consider GeoIP to have its legitimate uses, but please, bear with me and read on.<\/p>\n<p>While my primary PC updates itself to Windows 10, I feel the need to express something that has been nagging me for a few years now. \u00a0Allow me to set the stage a little, so you can get to understand the depth of my pissed-offedness.<\/p>\n<p>I am a US citizen, my primary language is Englilsh, though I have some high school\/college Spanish, plus a smattering of Czech, Bulgarian, UK English (two cultures separated by a common language), and German. \u00a0I live overseas, and in the past eight years I&#8217;ve lived in Bulgaria, the UK, Czech Republic, and Germany, with several trips to Ukraine and Italy.<\/p>\n<p>I manage software teams for a living. \u00a0Used to be a great developer, transitioned to management, now my coding is a bit rusty but I still can tell what&#8217;s done well&#8230;and what&#8217;s not.<\/p>\n<p>And right now, I have yet to see, in my entire life (which encompasses doing software for longer than the Internet has been around), someone do GeoIP correctly.<\/p>\n<p>I don&#8217;t mean doing stupid shit like calling the service nine times with every page load (seen that, dumb error, and the dummy that did it couldn&#8217;t for the life of him understand why he was racking up fifteen-k bills every month). \u00a0I mean something even stupider &#8211; basic UX.<\/p>\n<p>Websites, applications, customer service lines, all these are connections to your company, right?<\/p>\n<p>Well, users &#8211; when they are interacting with your company &#8211; are slowly coming to the conclusion that they&#8217;re tired of dealing with different connections. \u00a0They want one thing: \u00a0<em><span style=\"text-decoration: underline;\">a coherent conversation<\/span><\/em>. \u00a0They want to talk to your company in a single, contiguous conversation, as if they were talking to one single person. \u00a0In eComm terms, this is entitled &#8220;omni-channel&#8221; &#8211; no matter what angle of approach your customer takes, the connection they are using needs to have full knowledge of their entire conversation from whatever other angles that conversation may have taken place.<\/p>\n<p>Now, back to where I was going before: \u00a0GeoIP. \u00a0For those who aren&#8217;t aware of what that is, if you visit a site or use an app that connects back to its vendor&#8217;s company servers, there&#8217;s a certain kind of software that can look at the IP address your client machine is using and get a pretty good idea of where that IP is based out of. \u00a0So it will know if you&#8217;re connecting from New York, or Beijing, or London, etc.<\/p>\n<p>This is generally how a site decides what language to\u00a0clothe itself with when you visit. \u00a0It checks the GeoIP and decides to use that region&#8217;s site face and language based on the result.<\/p>\n<p>So I, personally, end up seeing a lot of German sites lately since I live in Germany. \u00a0That&#8217;s cool, I get it. \u00a0Once I&#8217;m there, I can usually find the language preferences and change over, or switch to a US English site or something. \u00a0If it&#8217;s a site that has user registration, they usually have a place to enter preferences on my account that includes language prefs (and big shame on them if they don&#8217;t have that).<\/p>\n<p>Here&#8217;s where the Stoooooopid comes in: \u00a0<em>too many companies are ignoring those preferences<\/em>. \u00a0Big companies. \u00a0Companies that should f&#8217;ing well know better.<\/p>\n<p>Like Microsoft.<\/p>\n<p>I bought Windows 7 Ultimate for every one of my currently\u00a0<em>four<\/em> PCs, just so I could pull down and install US English keyboard layouts and language packs. \u00a0I&#8217;ve been running them for what, six years now?<\/p>\n<p>And Microsoft knows this. \u00a0Every account that I have tied to my address (and I&#8217;ve had the same email address at borkedcode for over a decade now) with Microsoft is set to English.<\/p>\n<p>So this morning I bite the bullet, accept the license terms (in English), and press the buttons (all in English) to update to Windows 10.<\/p>\n<p>Guess what I&#8217;ve been staring at for the last twenty minutes?<\/p>\n<p>&#8220;Windows-Upgrade wird durchgefuhrt&#8221;<\/p>\n<p>&#8220;Ihr PC wird einige Male new gestartet, wahrenddessen konnen Sie sich entspannt zurucklehnen.&#8221;<\/p>\n<p>There&#8217;s a few umlauts in there, but because I&#8217;ve got a US keyboard layout, I&#8217;m not going back to stick them in.<\/p>\n<p>I can guesstimate what this means, but for chrissakes, WHY AM I SEEING THIS IN GERMAN??? \u00a0It&#8217;s not like my PC didn&#8217;t have everything set up in English for starters. \u00a0It isn&#8217;t as if they didn&#8217;t know in advance, right?<\/p>\n<p>Here&#8217;s another example: \u00a0I play World of Tanks and World of Warships. \u00a0Wargaming.net has some of the dippiest UX people (on par with CCP, whose &#8220;let&#8217;s reinvent the wheel just for us&#8221; rivals the US Midwest in its dingleberry attitude) around. \u00a0I originally signed up while living in Czech, probably six years ago.<\/p>\n<p>Guess what language I get emails from them in? \u00a0After SIX goddamned years, numerous installs, setting my language prefs in my account profile, and so on?<\/p>\n<p>You guessed it, I get Czech emails.<\/p>\n<p>Talk about your dumb-shit programmers. \u00a0If it weren&#8217;t for Google Translate and Chrome&#8217;s auto-translate feature I&#8217;d be up the creek.<\/p>\n<p>Now these two are sadly not unique, in fact I can think of only one firm that does get it right (sadly, it is that king of bad UI, LinkedIn). \u00a0 There may be other rare unicorns that do this.<\/p>\n<p>Tying this back into the omni-channel experience, this is a lot like having a conversation with someone, politely inquiring if they speak your language, and having them reassure you that yes, they do, yes, they are cool with that.<\/p>\n<p>And then every second sentence out of their mouths they speak Icelandic or Norwegian and give you a funny look when you get frustrated and ask\u00a0<strong>yet again<\/strong>\u00a0for them to speak to you in English.<\/p>\n<p>It is jarring, it breaks the flow of communication, and most of all, for users expecting to have a conversation with your company, it is\u00a0<em><strong>intensely disrespectful<\/strong><\/em>.<\/p>\n<p>So to all those firms who use GeoIP and\u00a0<em>screw it up\u00a0<\/em>for your customers by thinking GeoIP is the right answer for everything, allow me to spell out the logic train for you that you MUST follow if you want to get this aspect of omni-channel right.<\/p>\n<p>The following user story will be told from the perspective of the company app or site. \u00a0I&#8217;ll repeat it from the user&#8217;s perspective after.<\/p>\n<p><span style=\"text-decoration: underline;\">User Visit (or use of App):<\/span><\/p>\n<ol>\n<li>User first arrives, and as far as we know they are entirely anonymous.<\/li>\n<li>Check for our cookie &#8211; is there one?\n<ol>\n<li>If yes, check for a language pref in it. \u00a0Use that language if there is.<\/li>\n<li>If not, that&#8217;s cool, put a call in to GeoIP and give them the default for their region.<\/li>\n<li>During their visit, if they permit us to drop a cookie, save their language pref in it if they specify one. \u00a0Otherwise, leave it to default for their region as identified in 2.B.<\/li>\n<\/ol>\n<\/li>\n<li>Did the user log in using a registered account?\n<ol>\n<li>If yes, check the account for a language pref &#8211; is there one?\n<ol>\n<li>If yes, discard any result found in 2 and replace it with the language pref found in the account.<\/li>\n<li>If no, proceed as dictated by the result with 2.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Did the user register an account with us during his\/her visit?\n<ol>\n<li>If yes, be sure to save the language pref determined in 2 (which might be no pref assigned if they left it as default)<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"text-decoration: underline;\">Broadcast Advertising (email):<\/span><\/p>\n<ol>\n<li>Marketing begins building the broadcast list<\/li>\n<li>Among the addresses to send to, for each one,\n<ol>\n<li>Does the email to which we are sending messages have an account registered with us?\n<ol>\n<li>If yes, is there a language preference?\n<ol>\n<li>If yes, <i>is the message we are about to send in that language?<\/i>\n<ol>\n<li>If no,\u00a0<em>remove that email from the address list<\/em><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>These rules express a very simple concept: \u00a0<b><i>as soon as you know who you are dealing with, or as soon as this new person tells you their preference, use the language they told you they prefer to use. \u00a0The ONLY time it is acceptable to use the GeoIP-determined default is with an anonymous user or one who has not indicated a preference.<\/i><\/b><\/p>\n<p>From the user&#8217;s perspective now:<\/p>\n<p><u>Visiting a site or using an app:<\/u><\/p>\n<ol>\n<li>I arrive at site. \u00a0Site is in local language.\n<ol>\n<li>This is totally cool, it is expected. \u00a0If I prefer something else, I&#8217;ll go looking for the language settings.\n<ol>\n<li>My expectation right now is that for the duration of this session, the site will retain my language pref once I set it.\n<ol>\n<li>If you fail at this, there&#8217;s no way I&#8217;m going to trust you to keep my information or my money safe, unless you are absolutely the only supplier of whatever commodity I&#8217;m after.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>Site might ask me to accept a cookie.\n<ol>\n<li>If I permit this,\u00a0<span style=\"text-decoration: underline;\"><em>I now expect my language settings to be stored there so that on my next visit I won&#8217;t have to jockey around looking for language settings.<\/em><\/span>\n<ol>\n<li>(If I visit with another device, I might not know that it is cookie-driven, which will be a necessary inconvenience and I&#8217;ll have to set the language again. \u00a0However, this is expected behavior, and I won&#8217;t be upset by this as long as that other device retains some persistence if I permit cookies there too.)\n<ol>\n<li>If you fail this, it&#8217;s going to become progressively more irritating and eventually I will stop using your site or app because I&#8217;m tired of telling you what language to use.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<li>I might register an account with the site.\n<ol>\n<li>If I do, and if I set a language preference,\u00a0<span style=\"text-decoration: underline;\"><em>I now expect you, the company, to know in all of our future dealings with me\u00a0<strong>to use that langauge specified in my preferences<\/strong><\/em><\/span>. \u00a0That applies from now until I tell you to delete my acocunt. \u00a0It also applies if I switch my language prefs a year from now (because maybe I&#8217;m taking German classes and I&#8217;ll want to start seeing my sites in German to keep me learning more).\n<ol>\n<li>If you fail at this, I&#8217;m going to write a long blog post about how stupid an error this is, and put it up somewhere nice and public with your company name in it so everyone I know can shake their heads and say &#8220;You&#8217;d think now that we&#8217;ve had twenty years of Internet people would get this.&#8221;<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>Okay. \u00a0Rant complete. \u00a0I hope the logic flows described above help you. \u00a0I expect not only will they make your relationship with your customers somewhat more productive, but they&#8217;ll also save you a little money on all the calls you&#8217;re making to the GeoIP service.<\/p>\n<p>And if you&#8217;re just a user who also happens to agree with my take on this, I&#8217;d appreciate it if you&#8217;d &#8220;Like&#8221; and &#8220;share&#8221; this among your own circles. \u00a0Maybe someone in a dev department will see it, and think &#8220;Oh holy crap yeah, we really should fix that.&#8221;<\/p>\n<p>Thanks for the ear.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi all. Forgive the incendiary headline. \u00a0I do consider GeoIP to have its legitimate uses, but please, bear with me and read on. While my primary PC updates itself to Windows 10, I feel the need to express something that &hellip; <a href=\"https:\/\/www.borkedcode.com\/wp2\/2015\/08\/07\/geoip-is-not-acceptable\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,15,17,26],"tags":[83,86,111,139],"class_list":["post-873","post","type-post","status-publish","format-standard","hentry","category-business","category-it","category-pc-stuff","category-software","tag-frustration","tag-geoip","tag-omni-channel","tag-ux"],"_links":{"self":[{"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/posts\/873","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/comments?post=873"}],"version-history":[{"count":0,"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/posts\/873\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/media?parent=873"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/categories?post=873"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.borkedcode.com\/wp2\/wp-json\/wp\/v2\/tags?post=873"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}