What does it cost to run Travelfish?

Start a website! It’s free!

LOL.

I came across a post a week or so ago that detailed what it cost an “online company” to remain online. I found it to be astoundingly high, but it did make me wonder just how much it costs us to keep the hamster-wheel at Travelfish spinning. How much do all those $5 monthly charges add up to in the end?

Here’s what I put together. Obviously, the tech side is a small portion of our expenses — the vast bulk of our earnings goes to our writers — but I’ve kept it technology focused. I also haven’t included Upwork costs, which are related to when I occasionally use a contractor to assist with a server management task or programming/inputting drudgework.

As a couple of the charges are traffic based (Mapbox, Amazon S3) and as our traffic is somewhat seasonal, there is a little bit of variance month to month. I’ve also included services that are free for the level of use we use them at, but which have paying tiers.

Lastly, I’ve included a brief on each after the list, explaining why we use each item and if whether I’d recommend them.

Essential to keep the site up
Server hosting with Server Beach (now Cogeco Peer) $274 per month
Amazon S3 $160 per month
Mapbox $215 per month
Google site search $750 (annual) 150k queries, lasts almost a year
SSL Cert $99 annual

Analytics
Chartbeat $9.95 per month
Google Analytics Free
Google Webmaster Tools Free

Security & making my life easier
Sucuri $89.99 annual
Akismet $50 per month
Bugsnag Free
Mailchimp $30 per month
Dropbox Pro $100 per year

Marketing
Aweber $149 per month

SEO
Moz $99 per month

Payment processing
Stripe

Productivity/management etc
Asana Free
Toggl Free

Random
Pinboard $11 annual

Prefer all the above in a chart? Here you go.

Cheque please!

A few more thoughts

Server hosting
We signed up for a dedicated server with ServerBeach years ago and have been through probably a half dozen servers with them over the years. No complaints. Very proactive support with a decent turn around on support queries and hardware failures. Have had one significant stretch of downtime in the last decade.

Amazon S3
We use S3 for image hosting and other storage needs and desires. There is a significant performance uptick in doing this rather than hosting the images locally. Would recommend it for any website with a lot of images.

Mapbox
We use Mapbox throughout the site and in the PDF travel guides. Very comprehensive documentation for their API and we’re a big fan — though the costs do add up. A free alternative is Google Maps, but we vastly prefer Mapbox.

Google Sitesearch
Having a 40,000-page website means you’ll be needing a search tool. We pay Google in order to be able to use their search tool free of ads. We buy it in chunks of 150,000 search queries, which lasts us almost a year, give or take.

SSL Cert
Essential if you’re running a https:// site. There are cheaper means to this and we’ll probably stop using Comodo next year.

Chartbeat
Site analytics with a social tilt and with a site uptime side service. We were put onto Chartbeat by a friend at a newspaper who gets a lot of social traffic. As social isn’t a large traffic source for us, this isn’t so much fun and I keep meaning to cancel it. Maybe this month. If you do have a significant amount of social traffic, Chartbeat is worth a look.

Google Analytics
Essential if you want to keep on top of what is happening on your website.

Google Webmaster Tools
An imperfect tool for keeping an eye on the overall health of a site from Google’s perspective.

Sucuri
This is a WordPress monitoring service which we use for the sole remaining WordPress install on the site. If you use WordPress, this is well worth considering.

Akismet
While you can use a single Akismet API key for free, we upgraded when we were using a bunch of WordPress installs. Now they’re all gone I could probably reduce this to the one-off fee ($5 per month from memory) as we still use the API for spam control on the forum, but Akismet is a great product and we’re happy to keep supporting its efforts to keep comment spam under control.

Bugsnag
Handy tool for monitoring the site for PHP and other coding errors. Free for up to 250 errors a day.

Mailchimp
We use these guys for transactional email delivery (password resets etc). Every month when I get the invoice my teeth grate as we previously used their associated service (Mandrill) but then it got rolled into Mailchimp and you were forced to pay another $10 for a mailing list you don’t want. Penny pinching or what? We went to switch to another company but they refused service because we are in Indonesia – never ceases to amaze me when companies thumb their noses at a country home to the fourth largest population on the planet.

Dropbox
We use Dropbox Pro (not business) for image management between us and the writers and while we pay for their licenses too, we’re just listing the one account for the purposes of this piece. Avoid their enterprise product.

Aweber
You do get our newsletter right? Aweber isn’t free and it isn’t perfect, but it works. We have more than 10,000 subscribers and the inertia involved in moving to another service (which would never, ever be Mailchimp – see above) keeps us here.

Moz
I want to love Moz but I don’t and having been with them for a year will cancel this month. The product is good, especially the initial period when you first sign up and the site audit was very useful for fixing glaring errors, but as time goes on, at least in our case, we’ve logged in less and less. We don’t take a particularly competitive SEO position — we follow the rules and concentrate on content — so some of this was definitely a bit of information overload for us.

If you’re into SEO and particularly if you want to get into competitor analysis, then this is worth the money, but if you essentially just want to check you’re not doing anything especially stupid, then perhaps use it for a month or two then cancel, or pass on it and just follow the founder on Twitter, as he links out to a lot of very interesting stuff and his “Whiteboard Fridays” are reliably interesting.

Stripe
We use this for payment processing for Travelfish premium members and for travel planning consultancy. Stripe is awesome and better than Paypal in pretty much every single way imaginable. Their fee base is percentage based per transaction.

Asana
I wrote about Asana when we first started using it way back when here. The more they added features the less I used it, to the point now where I don’t understand what is going on anymore. Sometimes simplicity is an asset. We don’t use it anymore.

Toggl
This is a personal time manager which I can sync from laptop to phone. I love it. Very simple to use. If you want to get on top of what you spend time on, in a very simple format, this is great.

What we don’t use and what we do instead
Any kind of social networking management accounts (Hootsuite etc etc etc and etc). We do it old school — though I am taking a break from all of them for now.

We don’t use Slack for team collaboration and communication (I find Slack infernally confusing and counter-intuitive to use), instead using a private Facebook group and email and Skype.

No accounting or budgeting software. Instead budgets, GST, accounting, payments etc are all in a single excel sheet which we send to the accountant annually.

Oh, I almost forgot Pinboard
I signed up for Pinboard solely because the guy who runs it is one of the funniest tech people I follow on Twitter!

Switching Travelfish to https: A quick walkthru

We recently switched the Travelfish website over from http to https and it appears to have run very smoothly (touch wood!). As Chris at TravelHappy asked, here is a quick wrap on what I did and a few heads up to potential issues.

Why
Primarily because of moronic telecom companies here in Indonesia (Hello Telkomsel!) who hijack sites which do not use https to inject their own ads and popups into the website. I have written about this previously here – it is an absolutely bottom-feeding parasitical practise, but, currently, is not illegal in Indonesia.

The site
Travelfish is a travel content site of give or take about 25,000 pages. These pages are served via 100 templates (again give or take) and serve around a couple of million impressions per month. It runs off of PHP and MySQL. Pretty bog standard stuff.

The CMS
While we have a handful of WordPress installations tacked on the side, the vast majority of the CMS is custom.

Images
Some are hosted on the server but most are on S3 with Amazon Cloudfront.

Embedded content
We use Mapbox for almost all of our mapping, and Vimeo for nearly all videos (which are primarily on just the one page). Otherwise there were a few Youtube embeds and so on scattered around the joint.

Ads
We don’t run any third party served ads (Google Adsense for example). This made the whole task considerably easier.

The process
I’m not going to bother covering getting an SSL certificate and setting that up, as there are a bazillion tutorials already online about that. In our case it was already set up as we were already using it for login stuff.

Going through the templates
The main headache is “mixed content” where you have a https page that is calling an item (say an image or icon) from a non https source. This mixed content causes browser warnings and, in some cases the page won’t load.

What this meant was that we had to change every single link in the site that pointed to http://www.travelfish.org/ to https://www.travelfish.org. So, there’s no shortcut route here, we needed to go through every template and check that every url was https.

That was a fun day.

At the same time, we had to check that all our support files (javascript, css, icon files, font files etc) were both hosted on https and called by their https address. Same went for third party content like mapping. Not complicated to fix – just tedious.

This was another fun day.

As we make heavy use of templates and PHP functions to generate chunks of standard content, the above was a lot less painful than if it was all vanilla HTML, but, well, your mileage will vary. It all needs to be changed — every bleeding line.

Aside from the tedium, there are a couple of things to watch out that are worth mentioning.

Hardcoded http in 3rd party files
http:// addresses that are hardcoded into Javascript and css files are a hassle. In one notable case, if you’re using Google Sitesearch as we do, there is a problem as the search JS script is hosted with Google (at //www.google.com/afsonline/show_afs_search.js), but the JS file contains a hardcoded http:// reference which creates a mixed content warning

This meant I had to pull down the script, change the http: to https: and host it on our server (as obv I can’t change the code Google is hosting). The downside of this is of course is if Google changes something the script breaks — so far so good 😉

Images at S3
This was one of the main reasons we had delayed the switch to https because of the complexity is getting a SSL certificate that would cover all the images there. To be honest, I still don’t really understand all this, but this explainer at the aptly named Delicious Brains (their blog has lots of interesting stuff too), worked a dream and made all of our images and other stuff secure with a minimum of effort (and zero cost).

Once all the images and all the support files had had their references updated, we moved on to the content.

The database
Plenty of our content in the database (accommodation reviews etc) has links hardcoded into it. Rather than doing search and replace through the database to fix this, we took the more gradual approach of:

a) On the public template pages we replaced the old url with the correct ones as a part of the process of querying the database and formatting the output with PHP.

b) We adjusted our CMS to do the same, so any time we open a record in the CMS any baked in links are updated permanently when the record is saved. Over time, all the records will be updated.

The forum
One issue here was members being able to post images that were hosted elsewhere. The problem was that people may not always post images from a https source so we’d end up with a mixed content warning. We dealt with this by forcing the image to https (again by replacing the url with the PHP str_replace function as in (a) above). What this did was if the image wasn’t hosted on https the image broke — but no mixed content warning. That was preferable result to our mind.

WordPress
As an aside, if you’re built on WordPress, you’ll want to avail yourself of the following plug-ins to make your life easier. Both should be self explanatory.

Search and replace
SSL Insecure Content Fixer

WordPress’ new image handing with srcset can be an added complicating factor. The easiest approach is to just disable srcset by adding the following to your functions.php file:

function disable_srcset( $sources ) {
return false;
}
add_filter( ‘wp_calculate_image_srcset’, ‘disable_srcset’ );

Once all this was done, mix yourself a major gin and tonic then:

1) Upload all the files
2) Add a sitewide 301 redirect in the .htaccess file sending all traffic from the http:// to the https:// (this should catch any hardcoded links I missed plus deals with all inbound traffic)

And see what happens.

In our case (SO FAR) it ran smoothly. No noticeable traffic budge (in either direction) and no Webmaster Tools freak out warnings. Note you will need to register the new domain in Webmaster Tools if you want to busy yourself with their beyond pointless 404 reports.

And, that’s a wrap.

Adblocking: down the track in travel

I’m not going to go to deep into the pros and cons of actually using an adblocker, other than to say I don’t agree with their use — especially if a publisher makes it clear they don’t want you to use one. Instead I wanted to write about what the results of adblocker use by a large majority of readers might look like down the track, within the travel writing sphere.

There are three main aspects to this. How advertisers and ad networks will respond, how publishers will be affected and how readers will be affected. What will happen to the reader’s experience is the most important to my mind, but I’m treating it last as the other two are inter-related and contribute (obviously) to the reader experience.

How advertisers and ad networks will respond
Two primary arguments are raised by the pro-adblocker camp: Ads are annoying and detract from the reading experience and adtracking is loathsome. Currently, most adblockers block third party Javascript, which is used to load both ads and tracking cookies, removing both issues.

The most straightforward way to address the first part of this (the ugly annoying ads) is to load them server side. Plenty of sites already do this, so those ads are (generally) not blocked; expect to see more of this. Adblockers can block on creative size — for example, they can block all images that are IAB unit sizes — but there will be a considerable amount of collateral damage to this approach (as not all 300*250 images are ads, for instance).

Getting around the tracking block is more difficult but not impossible. Assigning unique IDs to readers and then identifying characteristics like referrer (where available!) and other user-agent/platform stuff, plus plenty of site specific stuff (such as time on site and pages viewed) is relatively straightforward. This information could then be baked into the querystring and passed to an adserver on click (because the ads are now being served server-side). Some publishers would probably agree to bake that into their entire site navigation for enough $$. Sure, it’s not as comprehensive as current tracking, but it is a start. Take a look at ANY Online Travel Agent querystring once you’ve surfed around a bit to see what I’m talking about.

Content-wise, what should we expect to see? A massive growth in native content — this is basically advertorial, renamed to make is remotely more socially acceptable. Brands pay the publisher to have their editorial staff prepare stuff related (sometimes vaguely, sometimes very specifically) to the brand, whittling down the editorial/advertising Chinese wall. As Medium founder Evan Williams says, “Native ads are the only thing that can work. Other stuff hasn’t been a win-win especially for users. It’s on its last legs.” I’d never categorise native advertising as a win-win, but Williams’ sentiment is a common one.

Responsible publishers clearly disclose native content — phrases like “Partner content”, “In conjunction with” and “Sponsored by” are all code for advertorial. Of course, clearly disclosing native content to your readers means you’re also clearly disclosing it to adblockers. So expect adblockers to increasingly block this material as well.

Therefore the next step will be for brands to require undisclosed native content blended in as closely as possible to editorial content. This will be far more difficult for adblockers to detect correctly and remove. It will also be extremely difficult for readers to realise what they are reading is actually an ad.

This last step is a double win for the advertiser — unblocked content that readers don’t realise is advertorial. It isn’t so much a great thing for publisher trust because when readers realise they’ve been tricked into reading an ad, they’re generally not very happy.

So the ads and much of the tracking are gone — yay! They’ve been replaced by material that is advertorial and indistinguishable from editorial — not so much yay!

What will happen to small-scale publishers?
At, say, a 75% percent block rate, many independent smaller scale publishers (ie too small to have dedicated ad and tech teams) will stop publishing. Aside from lawyers, bankers, cocaine dealers and politicians I can’t think of many occupations who work with a 75% profit margin; take away three-quarters of any business’s income and it will struggle. Non-professional hobby sites will undoubtably continue, but maybe they’ll just pull in enough for a slab of beer annually rather than monthly.

Obviously a wise approach as a professional publisher is to not have all your eggs in one basket — being totally reliant on advertising has never been the best idea. Travel-themed affiliate marketing and ebooks are two obvious and relatively easy candidates to help in this regard. But these revenue streams too may well be blocked in the future by adblockers because of the zeal of people who simply think information should be free (never mind the cost of compiling the information).

In travel publishing, we’ll see a vast growth in advertorial (sorry, I mean native content) — not that it wasn’t already a massive reader problem in travel. Expect more luxury hotel insider pieces paid for by luxury hotels, adventure travel experiences paid for by adventure travel companies, local food pieces written by local food tour providers, PR companies paying for guidebook writers to visit certain properties and so on. The travel vertical is already awash in native stuff. Expect to see plenty more from publishers willing to do it and less and less of it to be disclosed to the reader.

The reader experience
As an adblocking reader, you’ll be tracked less and see fewer ads. You’ll also be presented with far more content that, well, is probably actually an ad. You didn’t realise? That’s the idea. And if you don’t use an adblocker? Well, you’ll still face reading crappier content online as well as some publishers bend to the new regime.

For some readers, this is a reasonable trade off. But it is worth considering that the most likely result to your “hating ads” and so blocking them, will be getting to read ads without realising they’re actually ads.

And whatever you do, don’t worry about all the tracking that is going on while you browse the web logged in to Facebook. (That was sarcasm.)

On Travelfish
Advertising is a minor but important part of our revenue stream. If 75% of our readers blocked ads, we wouldn’t be very happy about it, but we wouldn’t go out of business. You’ll never read native content on Travelfish. We’d shut the site down before it came to that.

We will continue to run ads, as we currently do, primarily through Google Adsense which remains, by far, the most cost-effective way for a small publisher to monetise their website. To the full extent that the Adsense platform permits, we disallow advertiser practices that present a poor user experience or enable excessive tracking. For example, we block third party and interest-based ads as well as more than 2,000 “Google-certified ad networks”. There is definitely a revenue cost for us associated with blocking these “services”. Does this matter to adblocking software? No. An ad is an ad is an ad.

If the adblock rate gets high enough, we’ll paywall adblockers. Don’t want to pay and don’t want to turn your adblocker off? Take your entitlement over to Wikivoyage please. (This is not meant as a slight to Wikivoyage – they’re a solid site – but rather highlighting a non-commercial site providing similar information to Travelfish.)

We don’t think we’ll be the only publisher to do this — others who get that icky feeling about native content may well do the same. If you buy an adblocker, consider that down the track you may also have to buy access to a site in lieu of seeing their ads. Some people are cool with that; if so, everyone is happy.

One thing I’ll give adblockers: blocking comments on blogposts was a great idea. But what about the perfect adblocker?

Does social matter?

If you have a travel-related website, perhaps not.

A big fat NOTE up front here, I pulled together this information from SimilarWeb which delivers estimated stats on desktop traffic and I couldn’t see any way to split the stats out by device. One would imagine the stats would be somewhat different on mobile.

Anyway, I gathered the site stats on ten travel websites (Lonely Planet, Rough Guides, Fodors, Frommers, Travelfish (my site), Tripadvisor, Moon, Wikitravel, Travellerspoint and Gogobot) and then gathered the same information for ten news websites (NYT, Guardian, The Atlantic, New Yorker, SMH, BangkokPost, FT, The Australian, LA Times and the Independent). I then plonked them all into a spreadsheet and made the following four simple charts.

Get a magnifying glass for social.

Get a magnifying glass for social.

Social traffic
This is FAR more important to news websites than travel. Rough Guides derives the largest proportion of its traffic from social, but it is still below 5% of overall traffic – the average across the ten travel publishers was just 2.09%. Compare this to the Independent in the UK who gets 36.68% of traffic from social, with an average across the ten publishers of 22.03%.

Search traffic
This is the bread and butter to travel publishers, with an average of 73.62% across the ten. News by comparison is just 30.66% across the ten. Similarweb doesn’t break out results from news.google.com so I’m assuming it is wrapped into the overall Google figure. I’m kinda surprised it is this low, but, to be honest, I can’t remember the last time I looked at Google News – Twitter is now my newsfeed.

A closer look at social for travel websites. The “big three” are Facebook (52%), Twitter (16%) and Reddit (16%), but there are very big fish in a tiny pond. Taking Rough Guide for example, their largest social source of traffic is 41.43%, but that is 41.43% of 4.48% of their overall traffic – ie Facebook represents 1.85% of their traffic.

One point eight five percent.

This all makes sense I guess, breaking news is far more “share-worthy” than a profile of the guesthouse that you stayed in last night, so maybe give that some thought before you slather social sharing buttons all over your website.

Traffic data is here.

Why is Indonesian telcom firm Telkomsel hijacking websites?

Update, added a couple of links below with previous coverage on this scabby behaviour.

Indonesian telcom firm Telkomsel have for a while been injecting crappy little banners above websites without the website owner’s permission. This happens if you’re using their prepaid 3G simcards. This has for years been regarded as a particularly crappy parasitical practice, but Telkomsel take it to an extra level by coding it so badly that the sites they are injecting the ads onto (including mine) get broken.

Here are some screenshots:

Travelfish homepage
This is a “best case” usage as the injected ad (the “weplay” leaderboard up top) doesn’t actually break the site.

Example 1

Example 1

Travelfish forum page
This is a “bad case” usage, where, because their crappily coded stylesheet uses the same element names we do, it breaks the form on this page (it overly widens it) making it impossible to read the screen.

Example 2

Example 2

Agoda booking form
This is a “worst case” usage, where the crappy Telkomsel code makes the Agoda page unusable. I’d imagine Agoda and Priceline’s legal departments would find this of considerable interest.

Example 3

Example 3

Here’s the code Telkomsel are using to inject the ads — they are clearly hosting it. I’ve wrapped it for legibility and bolded a couple of the ad serving URLs.

For websites that are transactional, like Agoda, there is a clear revenue affect here where the ad code Telkomsel is inserting is making Agoda’s website unusable. For other sites, like ours, it is just a PITA.

<head>
<noscript>
&lt;meta http-equiv="refresh"content="0;
URL=http://ads.telkomsel.com/ads-request?t=3&amp;
j=0&amp;i=174559005&amp;
a=https://www.travelfish.org/board/post/hongkong/21242_what-s-the-most-famous-attraction-in-hong-kong-/0"/&gt;
</noscript>
<link href="http://ads.telkomsel.com:8004/COMMON/css/ibn.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="http://ads.telkomsel.com/ads-request?t=3&amp;i=174559005&amp;j=2&amp;
callback=_.jsonp501&amp;rnd=501&amp;
a=http%3A%2F%2Fwww.travelfish.org%2Fboard%2Fpost%2Fhongkong%2F21242_what-s-the-most-famous-attraction-in-hong-kong-%2F0">
</script>
<script type="text/javascript" id="placeholder-script"
src="http://ads.telkomsel.com:8004/PHD/00030/main.js">

</script>
<meta content="minimum-scale=1.0, width=device-width,
maximum-scale=0.6667, user-scalable=yes" name="viewport">
<meta content="yes" name="apple-mobile-web-app-capable">
<title>What's the most famous attraction in Hong Kong? :
Travelfish Hong Kong travel forum</title>
<script type="text/javascript"
src="http://ads.telkomsel.com/ads-impression?j=2&amp;i=174559005&amp;adsTransactionId=X20111104155602394&amp;
orgUrl=http%3A%2F%2Fwww.travelfish.org%2Fboard%2Fpost%2Fhongkong%2F21242_what-s-the-most-famous-attraction-in-hong-kong-%2F0
&amp;callback=_.jsonp866">

</script>
</head>
<body>
<div id="container">
<div id="top-banner">
<div id="offdeck-ads-div"
class="offgroup"
style="height: 69px; padding-top: 2px; padding-bottom: 0px;
margin: 0px auto; background-color: rgb(221, 221, 221);
position: relative; box-shadow: rgb(0, 0, 0) 0px 2px 3px;
-webkit-box-shadow: rgb(0, 0, 0) 0px 2px 3px; z-index: 50;
clear: both; background-position: initial initial;
background-repeat: initial initial;">
<div id="ads" style="width:100%;text-align:center;">
<div align="center">
<a href="http://telkomselprod.amobee.com/upsteed/actionpage?as=15353&amp;t=1411104155737
&amp;h=2344839&amp;pl=1&amp;u=6240000982570065&amp;isu=true
&amp;rid=f6f15490-3fbc-11e4-8391-2c768a4e8644&amp;i=10.103.143.29&amp;partner=Telkomsel
&amp;acc=4040581&amp;monitor=0&amp;n=http%3A%2F%2F&amp;a=85733636&amp;data=" accesskey="">
<img src="http://telkomselprod.amobee.com/content/4040581/85733630/85733629.gif" alt=""></a>
<img src="http://telkomselprod.amobee.com/upsteed/notification?event=3
&amp;correlator=4040581,85733636,15353,2344839,1,Telkomsel,1,6240000982570065,f6f15490-3fbc-11e4-8391-2c768a4e8644"
height="1" width="1" alt="" style="display:none">
</div>
</div>
<hr style="margin-top:2px; padding-top:0px; padding-bottom:0; margin-bottom:1px;">
<div id="toolbar" style="width:100%; text-align: center;">
<div style="width:300px; margin: 0px auto;">
<div style="text-align:right; width: 295px; display:inline-block; height:12px; vertical-align: top;">
<img id="btn-hide" class="ibn-ads-button" src="http://ads.telkomsel.com:8004/COMMON/images/hide.jpg"
style="cursor: pointer; height:10px; width: 50px; vertical-align: top;">&nbsp;
<img id="btn-close" class="ibn-ads-button" src="http://ads.telkomsel.com:8004/COMMON/images/close.jpg"
style="cursor: pointer; height:10px; width: 50px; vertical-align: top;">
</div>
</div>
</div>
</div>
</div>
<div id="middle">
<div id="left-banner">

</div>
<div id="content">
<iframe id="main-frame" scrolling="no"
src="https://www.travelfish.org/board/post/hongkong/21242_what-s-the-most-famous-attraction-in-hong-kong-/0"
height="5015" style="height: 5015px;">

</iframe>
</div>
<div id="right-banner">

</div>
</div>
<div id="bottom-banner">

</div>
</div>
<script type="text/javascript">
p={'t':'3', 'i':'174559005'};
d='';
</script>
<script type="text/javascript">
var b=location;
setTimeout(function(){
if(typeof window.iframe=='undefined'){
b.href=b.href;
}
},15000);
</script>
<script src="http://ads.telkomsel.com:8004/COMMON/js/if_20140604.min.js"></script>
<script src="http://ads.telkomsel.com:8004/COMMON/js/ibn_20140223.min.js"></script>

<div id="showbutton" class="sh-div sh-div-top-bottom sh-div-top " style="display: none;">
<span class="showbar">
<a id="btn-show" href="javascript:void(0)" style="padding: 5px; font-size: 10px; font-family:
verdana; color: black; text-align: center; font-weight: bold; text-decoration: none;">show ad</a>
</span>
</div>
</body>

So Telkomsel, could you stop doing this please?

Thanks.

Update 20 September 2014, seems I’m very late to the party on this issue. Here’s some others who are equally displeased with the situation.

On similar practises by another Indonesian Telco, XL, Batista Harahap says: “I can’t agree with these kind of practices. Period.”

Aulia Masna in October last year for Daily Social: “There is a concern that XL’s employees or anyone with access to this practice will be able to capture people’s login details for various websites.

I liked your post so much I didn’t read it

Last week, as a part of our “giving back in Southeast Asia” series we published a piece profiling the Soi Dog Foundation. They’re a group in Thailand doing great work helping stray dogs (and other animals) and are funded totally by donations. Nice work!

The charity pieces tend to get very few reads on Travelfish and this was no exception. But, as you can see from the screenshot below, the story got quite a few likes — 3,894 according to Facebook.

Likes all over the place!

Likes all over the place!

It wasn’t till the author of the piece let me know that the Soi Dog Foundation had shared the piece on their Facebook page, that this made more sense. Afterall, they have around half a million “fans” on Facebook. Sure enough, when I look at the piece on their Facebook page, there are the bulk of the likes — 3,580 of them.

How can you not like that dog?

How can you not like that dog?

I got all excited, expecting a tonne of (well 3.5 tonnes to be exact) readers on the story on our site. But, it seems I was barking up the wrong tree.

A bit of a dog.

A bit of a dog.

The above screenshot is from Google Analytics and shows ALL traffic to the story — not just from Facebook. The busiest day saw 313 reads.

What does this mean?

It means that one shouldn’t see Facebook likes as some kind of proxy for web traffic.

It indicates, that at least in this case, the vast majority of readers (90%) liked the post without reading it.

Perhaps most importantly, it means that a story displaying a badge saying it has x number of likes is largely meaningless. (We’re removing them in the redesign).

Lastly it means all stories you publish to Facebook should include a photo of a cute dog.

You can learn more about the great work the foundation is doing here.

How to speed up your website

The easiest way to speed up your website is to invest in a better server.

The second best way to speed up your website is to not have 3 meg GIFs of cats on the page.

But what about after that?

I took a typical Travelfish feature story page, with a standard Adload and went through a series of steps to see just how quickly I could get it to load. You’ll see that the problem of a lagging load are quickly taken out of your hands.

All results are via the smart cookies at Pingdom

Baseline
Grade 77
Requests 107
Load time 2.43 seconds
Pagesize 1.2 meg

Step 1: Remove all social sharing buttons
Theoretically effects ability of readers to share content on other networks.
Grade 80
Requests 81
Load time 3.54 seconds
Pagesize 1.1 meg

Step 2: Switch Adsense ads to async
No downside I’m aware of. That the code wasn’t already async was my oversight.
Grade 79
Requests 89
Load time 3.53 seconds
Pagesize 1.0 meg

Step 3: Reduce Jpg images from 80% to 60%
Slight change to image quality. More noticeably on retina screens. This was the biggest single improvement.
Grade 79
Requests 91
Load time 2.05 seconds
Pagesize .915 meg

Step 4: Split images across four S3 subdomains
This would have more of an effect if I had say a dozen images as there could be more parallel downloading. In this case a bit of a non issue.
Grade 78
Requests 91
Load time 2.01 seconds
Pagesize .916 meg

Step 5: Remove GAM to basic Adsense code
Removes ability for me to set an artificial floor on the ads displayed. Immediately started seeing weightloss ads. This change would have a revenue implication.
Grade 80
Requests 84
Load time 1.79 seconds
Pagesize 1.0 meg

Step 6: Dump to a plain HTML page
Removes ability to serve dynamic content.
Grade 80
Requests 82
Load time 1.15 seconds
Pagesize .918 meg

Step 7: Remove all ads
Obvious revenue implication!
Grade 85
Requests 37
Load time 0.715 seconds
Pagesize .614 meg

Step 8: Remove Facebook like code
Ego/social proof buttons no longer shown – this should have gone in step 1 – I forgot.
Grade 92
Requests 26
Load time 0.647 seconds
Pagesize .466 meg

Step 9: Remove Google search suggestion from the search box
Readers lose search suggestion.
Grade 97
Requests 19
Load time .416 seconds
Pagesize .361 meg

Step 10: Remove Google Analytics
Obvious loss of traffic measurements.
Grade 98
Requests 17
Load time 0.357 seconds
Pagesize .345 meg

So in ten steps I’ve improved load time from 2.43 seconds to .357 seconds — not too shabby. In the process though, I’ve removed all sharing, tracking and revenue opportunities. This is not exactly a win win situation.

Off the top of my head takeaways.
1) Any changes while still serving Adsense are difficult to measure as Adsense can serve wildly varying ads that will impact the Pingdom results. On one load I saw an Adsense cumulative load of around 700meg!

2) The “easiest” improvement was reducing the image quality. But there seems little point in doing this when Adsense can dump something massive in. The second easiest way is to remove ads. Great for readers — not so hot for the bottom line.

3) Google (and Facebook to a lesser extent) really need to consider adopting some of the “best practises” they keep advising everyone else to.

The parasites of travel

So this afternoon I received an email from a very well funded US travel startup called Hopper, titled “We shared your blog on Hopper”. It caught my attention because a week or so ago I’d called them a parasite on Twitter because of their practise of scraping other site’s content into their system, without permission and then “nofollowing” the links back to the source material (they do appear to have stopped this though). Anyone who knows anything about good link practises will agree this is scabby behaviour — perfected in fact by Wikipedia (but I’ll save that rant for another day).

So I was surprised to receive the email. As you can see from the screen shot below, the email had a prominent call to action, asking me to “See your featured post”. The link actually led to: http://www.hopper.com/x/x/E/2WoX?utm_source=blogger-email-a-bulleted-benefits&utm_medium=email&utm_content=experience-page-email-a-bulleted-benefits&utm_campaign=blogger-onboarding

Must click on the yellow box.

Must click on the yellow box.

From the URL I guess (a) they think I’m a blogger and (b) I’m being “onboarded”. Yay!

So of course, idiot that I am, I clicked on the link. Here is where I ended up.

Wow I'm a Hopper member!

Wow I’m a Hopper member!

There’s a few interesting things on this page.

a) There’s no mention, anywhere, of the Hopper Member who actually submitted this content.
b) The Blank headshot icon and “travelfish” near top left implies it was submitted by a member called “travelfish”.
c) Image is still pulled from our Amazon imagebank — so we’re paying. (this is a minor issue, but I’m feeling pedantic).
d) The image is credited to travelfish.org with a dofollow link, below the image. Image actually belongs to Penang Global Tourism who gave us permission to use it on Travelfish.org. We forgot to ask permission for Hopper as well.

Moving on.

If you click on the “travelfish” link near the top you get to the following page:

Us be parasites absolut.

Us be parasites absolut.

Wow. You know, I didn’t know I had an account named Travelfish. Well, I don’t actually. I guess perhaps someone else started up an account called travelfish… But hang on, who is this Matthew dude?

Now I’m guessing here, I’ll be generous and assume Matthew is a real person and not a bot scraping websites… but it seems he was the one who actually submitted the photo. That’s a bit surprising really as “Travelfish” is mentioned at least five times on the page and hell, if you ask me, with that prominent blank head shot and Travelfish up top, this really looks a lot like Travelfish’s member page — I guess they must be submitting their stuff to Hopper because they think Hopper is a shit hot site.

Actually we think Hopper is just shit.

It’s a fab example of the breed of funded travel startups who feel no need to, well, travel. Instead, they take a leaf out of Wikipedia’s book and hoover up, rewrite and nofollow.

The most ridiculous thing is, the photo used isn’t even ours. If our mate Matthew had even bothered to read to the bottom of the post rather than just act on a hoovering alert for “Hey it is Chinese New Year, go find some dragon images from somewhere to rip off” he’d have noted that the image wasn’t actually from Travelfish, but in fact from a tourism org who gave us explicit permission to use the image.

You know Hopper, you can do that — you ask people — or organisations — before you take.

But image use aside, I’m very curious about the “travelfish” account as it certainly appears to have been set up as a result of me clicking on the link in the email. Assuming that is the case, while it’s a clever little tech pirouette, nowhere in the email did it say that in clicking on this link I’d be setting up an account on Hopper, nor implying that I approved having an image that we were using under permission.

So, I’d appreciate it if Hopper could remove the Travelfish username and also blacklist the addition of any Travelfish content to their site, because, well, their site sucks and we don’t want to have anything to do with it whatsoever.

Thanks and have a great day!

Update
Received the following email from Jess Petersen, VP Product at Hopper this morning.

“Hi Stuart,

I just wanted to let you know that we’ve removed your content from Hopper as you requested, and added your site to our blacklist so that no more content can be shared from your site.

I’m very sorry that we upset you by sharing your content on Hopper. We are big fans of travelfish; in fact, one of our developers mentioned he got a lot of great advice from you guys on his 3-month trip though Asia last year.

Ultimately we are trying to build a site that benefits both travelers and bloggers, but we understand completely if you don’t want to be a part of it right now. We’ll keep working on making the site better, and we welcome your feedback along the way.

Hope you have a good day, and safe travels,
Jess

Jess Petersen
VP Product, Hopper”

So a thanks from me for acting quickly on this. Cheers

Escape from Gorontalo

It’s not often you meet a plane crash survivor in a hotel lobby, but that’s what happened to me last week, in the foyer of the New Melati Hotel in Gorontalo, northern Sulawesi. “Good morning,” I said, as I sidled up next to her, waiting for her to finish with the receptionist. She turned, smiled and blurted out, “I was in a plane crash last night. Our plane hit a cow.” [Story updated at end with apology from Garuda]

Indonesia: where the unexpected is to be expected.

The woman and her family had been on the Lionair flight from Jakarta to Gorontalo via Makassar on Tuesday, 7 August. Upon landing the aircraft either hit a cow “idling” on the runway and skidded off into the grass or skidded off the runway, then hit a cow. Both are perfectly credible as Lionair pilots do sometimes have trouble finding the runway, and as we later saw, plenty of animals hang out around the runway at Gorontalo airport thanks to gaping holes in the fences.

Not a cow in sight.

Not a cow in sight.

While uninjured, the woman I spoke with was still visibly shaken — she had only just found out that they had hit a cow (via media reports online). Lionair had told her and other passengers nothing at the time. She said it felt like the plane had hit something before it bumpily halted; passengers opened the emergency exits, but the crew told people to stay where they were, even though they could smell something burning. When they finally got off, they saw it was the grass the plane had stopped on.

But I’m not going to write too much about Lionair today. Instead I’m writing about Garuda: Indonesia’s flag carrier and, according to Skytrax, the World’s Best Regional Airline. Why? Because we had a flight out of Gorontalo to Makassar, then a connecting flight with Lionair the next day from Makassar to Bali. We were due to be leaving the morning I met the cowcrash survivor, on Wednesday 8 August.

No we're probably not flying anywhere today.

No, we’re probably not flying anywhere today.

We had booked back in May two legs: Gorontalo to Makassar with Garuda and Makassar to Bali with Lionair. A month after purchasing the tickets, Garuda advised us by email of a change in the time of the Gorontalo flight, which meant we would now miss the original connecting Lionair flight. When I contacted Garuda to explain the problem, they suggested we change the flights to the previous day — at a cost of 111,000 rupiah per ticket. So even though we were changing the tickets in response to a change Garuda made, we still had to pay the fee. We sucked it up and paid, and were thus also forced to have an overnight stay in Makassar.

Then on Monday 5 August (two days before departure) I received an email, this time from the Garuda office in Gorontalo (which, by the way uses a Yahoo email account), notifying us of another schedule change. The flight was again being shifted from morning to afternoon.

Then, on the Tuesday, Lionair crashed into that cow, closing the airport to 737s (smaller aircraft, used by for example Air Wings and Sriwijaya, apparently used it the following day).

Gorontalo airport cow-gate.

Gorontalo airport cow-gate.

After meeting the cowcrash survivor, we asked the receptionist at our hotel to see whether the airport was open or not. It was closed; so I hoofed it over (geddit?!) to the Garuda office in Gorontalo for clearer information. There I was told the airport was closed, but that we were all confirmed on a Garuda flight the next day, which would allow us to still make our Lionair connection out of Makassar.

Early in the morning on Thursday August 8 (3:17AM!!!) I received an SMS from Gorontalo Garuda notifying a flight schedule change, with flight now departing at 13:50, with a note to call (0435) 830444 for more info. This number didn’t work.

At Garuda allowed our kids to sleep on the terminal floor.

Waiting for… Garuda.

We decided to be conservative and so headed to the airport early. Cost: 280,000 rupiah. Arriving at 11:00, we were first in line and Garuda staff at the ticket told us the flight was “on time”. We then tried to change our Lionair ticket onwards to Bali but were told by the Lionair staff that there would be a cancellation charge of 90%, as “there’s no problem in Makassar”. Cost: almost 3 million rupiah.

As time wore on, we expected Garuda check-in staff to appear. No. At no time did ANY Garuda staff come to address the passengers lined up waiting to check in. Then, at 12:35, Gorontalo Garuda texted to advise that the flight was cancelled (an hour and 15 minutes before ETD from Gorontalo). I asked Garuda staff at the ticket office at the airport what was going on, but they said they didn’t know. Other passengers were told by other staff that there would be a flight at 14:00, then at 16:00. No staff mentioned that the Lionair aircraft had still not been moved and this was why we couldn’t get out. The airport reportedly lacked the equipment to move it — we heard later they tried to move it with an excavator a bulldozer.

Happy Garuda customers.

Happy Garuda customers.

As the number provided by Garuda didn’t work, and the ticket office was a madhouse, I called Garuda in Jakarta at my own expense, spending 30 minutes trying to get advice on what we should do. They were unable to tell me whether any flight was happening that day or the next. With two tired children — and thanks to it being Idul Fitri, not a single shop open at the airport where we could buy water or snacks when our own supplies were finished — we gave up and returned to Gorontalo (cost 200,000 rupiah).

The check-in counter: We're all about service.

The check-in counter: We’re all about service.

Later, back at a hotel in Gorontalo — Garuda didn’t offer transport back into town, accommodation or meals — we spent another half an hour on the phone with Jakarta Garuda. Finally, they told us we had a confirmed reservation on Friday August 9. We then purchased connecting flights (with Garuda) to Bali for Sam and the kids (I was heading to KL). Cost: another 3 million rupiah.

What, do I need to spell it out for you?

What, do I need to spell it out for you?

Other friends who were also hoping to fly on August 9 (with Lionair) head to the airport earlier than us. Upon arrival, staff told the airport was closed to jets; they called the hotel to tell us. We then spent a full 80 minutes in total (across a series of calls) with Garuda Indonesia in Jakarta trying to shift change our departure city from Gorontalo to Manado, a nine-hour drive away. In the middle of this, we received an SMS from Garuda Gorontalo advising the flight is cancelled. Despite being on a confirmed flight on Friday from Makassar to Bali, we were now pushed to Saturday’s flight — which is full, so we were waitlisted.

Though on the first call we were told that charges will be waived if we shift to Manado, as the call dropped out we need to call back — again and again and again. And the final person, to whom we explained the entire scenario again, refused to waive the fee. We would have to pay an additional 2 million rupiah. (At the start of each call, we asked the Garuda agent answering whether, if the call drops out, they can call us back, and gave two mobile numbers. Each time, nobody called back. On the final call the agent told us that actually they are not permitted to call back clients.)

Trying to get a straight answer out of Garuda in Jakarta.

Trying to get a straight answer out of Garuda in Jakarta.

We then chartered a car for the drive to Manado (that’ll be another 1.2 million rupiah — we wonder whether the thought of putting a bus on for the scores of other passengers like us on the first day occurred to Garuda?). One of the kids was now coming down with tonsilitis, but that’s probably the one thing we can’t blame Garuda for. Though if we had been home by now, nobody would have been vomiting during the first hour of the drive, right?

Roughly five hours into the drive, at 18:57, we received an SMS from Garuda Gorontalo advising that a flight from Gorontalo to Makassar was due to depart Gorontalo at 20:10. We had to laugh. It was pretty hilarious after all. Check in is supposed to be one hour before departure; we were given 13 minutes to check in, and Gorontalo airport itself is a 45 minute drive from downtown. We ignore the text as we’re closer to Manado.

Gorontalo airport then called at 20:33 advising that the flight would indeed be departing soon (from Gorontalo). I explained that we were on the way to Manado.

The next morning, the gracious staff at Manado agreed to waive the change fee on the tickets and 1.5 hours later we were, finally, in Makassar. Sam and the kids however were still waitlisted on the flight to get back to Bali. The child with tonsilitis had a high fever return; we couldn’t sit outside the airport for four hours to see whether we would make the flight. Business class seats were available. We called it a minor emergency; the kids were starting school on Monday. We bought the upgrade. Ka-ching — another 3 million rupiah.

What could have been done better?

Placate
Nobody expects an airline to use a Twitter or Facebook account to move an aircraft. They do expect it to be used to assist in customer support.
Suggestion: @indonesiagaruda “We’re working with Gorontalo airport to get the Lionair aircraft off the runway ASAP.”

A timely tweet from Garuda in the midst of the drama

A timely tweet from Garuda in the midst of the drama.

Apologise
While we understand this whole drama was caused by either Lionair or Gorontalo airport’s incompetence, Garuda and its passengers were directly affected and Garuda was in complete control of how it responded to the situation. At no stage did Garuda use social media to address our concerns. We did get one message from an account we hadn’t actually tweeted to, telling us that they were trying to get confirmation of whether a flight would leave Gorontalo. But they never tweeted us again.
Suggestion: @indonesiagaruda “We apologise to our passengers stranded at Gorontalo airport and are working to rectify the situation ASAP.”

Pay attention
In ignoring our tweets, Garuda demonstrated a flagrant disregard for the wellbeing of their passengers. Why was international media able to pick up and respond to our tweets and photos while Garuda was unable to even acknowledge them?
Suggestion: @indonesiagaruda@sagabrown We’re sorry, the flight has been cancelled. Please return to Gorontalo and stay at the Quality Hotel — we’ll fix you up for it.”

Supply updates
In 2012, Indonesia had the fifth largest number of Twitter accounts in the world. Garuda has a Twitter account — one with almost a quarter of a million followers in fact. Why didn’t Garuda use its highly visible account to notify passengers of updates? Why did they pointedly ignore customers who were actively trying to contact them?
Suggestion: @indonesiagaruda “We’ll be running a courtesy bus to Manado for those who want to change their flights (free of charge). Contact the Gorontalo Garuda office for more information.” This was their chance to also supply a corrected phone number.

What did Garuda do instead?

Absolutely nothing.

We think this might make a rather good case study for carriers generally in how NOT to behave when flights are cancelled/delayed. We’d be happy to hear what Garuda thinks — so we’ve left the comments open.

We’re looking at tickets from Denpasar to Rome in September… but not with Garuda.

This one is for you LionAir (Pic http://borborigmus.wordpress.com/ )

This one is for you LionAir (Pic http://borborigmus.wordpress.com/ )

Final note
If you’re looking for a good argument for travel insurance (which we didn’t have because our preferred travel insurance provider World Nomads unfortunately doesn’t cover us in the country we live) this should be it.

Update: 19 August
I just received the following apology from the Social Media at Garuda Indonesia.
Dear Helpdesk Admin

following up the posting of “Escape from Gorontalo” listed on august 17th,2013, about cowcrush accident at august 6th,2013 in Gorontalo airport that caused cancellation of flight schedule. For the flight cancellation on that moment and airport service were not all Garuda Indonesia responsibility ,however,from the side of Garuda Indonesia, we would like to say sorry for the inconvenience and would like to say thak you for critic and suggestion.And we would hope and try for the best services in the future that apply very well to customer.

Thanks”

Travelfish turns 9 today

It probably strikes some as a bit odd that Travelfish’s “birthday” is the same as mine, but given it sometimes feels like an extra appendage, it seems appropriate — and it does save me one date to remember.

Another day, another year, soon another decade… But what has the last year brought us? Well first and foremost it has seen our slowly growing membership continue to work to make the site the great resource it is. Thank you — every single one of you — even those who drive me a little mad.

Separately, we’ve seen a dramatic deepening of our content in some areas, while others remain badly out of date. It’s a perennial juggling game, but with 18 excellent writers in the region we’re very well placed to address the out-of-date issue and we are working on it. Really.

We’re on a seemingly more solid financial footing — with 17 paid correspondents filing once or twice a week, one full-time writer based in Bangkok, plus, in the last few months (FINALLY) a programmer to assist me with the site’s tech needs — and Sam and I on the case pretty much around the clock, we seem to be just about there. It’s only taken almost a decade — but we’ve an excellent rounded team we are proud of. Travelfish writers, take a bow.

The site is still growing, both in membership and traffic, although both seem to be levelling off somewhat. We’ve never had a hockey-stick style growth — rather slow and more or less steady. Now, with a programming assistant on board, we’ll be adding a lot of new features to the site — some have been popped on already — that we hope will help our already dedicated readers become even more so. It should also help some drive-by visitors slow down a little more to take a good look at us.

So what’s on the cards?

As regulars will already know, we commenced research on Burma at the start of the year. Content will start to come online in the coming weeks. We also continue to expand our Indonesia and Malaysia coverage, and there’ll be a lot happening with some of our now quite dated Vietnam coverage in the coming year.

We’ve renamed our blogs to “wires” and they too are growing in readership — they do have a way to go before they start really earning their keep, but they’re certainly moving in the right direction.

We released our first iBook a month or so back, for Flores in Indonesia, and we’ve got a few more in the pipeline. We’ve phased out our well regarded iPhone apps in favour of iBooks, as we feel the latter are a superior planning tool. In a step that sets Travelfish aside from most in the travel publishing industry, there’s no DRM involved in our guides and they are 100% free.

This coming year is also going to see wholesale changes to our mapping system as we drop Google Maps in favour of MapBox and, in a step back to our humble beginnings, printable PDF maps. We believe both will prove to be considerably more useful than our existing offerings.

One of our first features with MapBox has been our “Where I’ve been map” that allows Travelfish members to mark where they have been in the region. This is the first step in a bit of a stroll we have planned.

We’ll also be shortly implementing a system to better reward Travelfish regulars for the contributions to the site — more on that soon — we just need a few more rainy days to finish it off.

Talking about the weather, our entire weather section is about to be relaunched with a complete reworking from the ground up. You’ll love it. Really.

We’ve also worked to make the forum a more useful platform for Travelfish members. We’ve improved the PM system and added more countries, for example, and have more planned for the coming months. For many Travelfish regulars, the forum is the core part of their site experience, and we want to help them get as much out of it they can.

Lastly, we’ll be reworking our entire transportation system so it will be easier for readers to compare different ways of getting from A to B, so they can choose what works best for them. We had something like this years ago but it fell over because we couldn’t get it to work properly — that is no longer the case and we hope to have it up and running before the end of Q3.

Well, that’s a bit of a wrap! Hopefully we’ll be able to pull most of the above off and we’ll recap a year from now — when we turn 10.

Thanks for reading!

Stuart & Sam