My fellow Tokyo tech cheapo Greg Lane and I co-founded TokyoCheapo.com three years ago. From our humble beginnings as a little side project, our baby has really grown up.
Three years on and the traffic has really jumped up, especially in the last year – from 50K monthly UV around April 2014 to 150K UV this month. And now we’re launching a much desired Tokyo Guide Book, click here and buy this awesome book – it will save you so much money!
Since the lion share of our traffic is from organic search, you probably all want to hear about our SEO strategy. Whilst we have put work into our SEO (mostly under the expert guidance of pagespeed.io), and perhaps even a little into content marketing, I would attribute the main reasons for traffic growth to:
- Having identified an underserved niche
- Writing good well researched and detailed posts
- And the gratuitous overuse of kittens
80/20 rule – (approximately) the top 20% of our articles receive 80% of our traffic.
1. You Need An Underserved Niche
The bad news first (if you’re trying to boost an existing content site), we had it easy. No one was really writing about Tokyo for smaller budgets but this was exactly what the world wanted. Tokyo had (still has?) a reputation for being very expensive which frightens off a lot of potential visitors. In reality Tokyo really isn’t that expensive, yet most of the popular media covering Tokyo tends to focus on the high end and extravagant (perhaps in chasing the advertising $$$) thus perpetuating the false reputation.
This is one of the main ingredients to our success, lots of people looking for the information we were putting out and no one else really writing it.
2. Good Timing
We’re also pretty good at stopping the press, photoshopping some animals into photos and pushing out a topical article should the chance suddenly arise.
Though a lot of our content is fairly timeless, we’ve still managed to massively boost the audience to some of our articles by dropping them at precisely the right time. For the most part this is fairly obvious – ice cream tends to sell better in the summer, but it also includes reacting quickly when an opportunity arises.
Examples:
- Publishing “3 nights in Tokyo on $100” a few days after the Mercer report (yet again) declared Tokyo as the world’s #1 most expensive city.
- Making sure we put out “Top Winter Illuminations” plenty of time before Christmas
- Slapping up a quick and totally unplanned “Halloween Report” with some snaps of the unprecedented craziness of the night before (Halloween is a new thing in Japan)
We plan ahead, and having run the site for more than a year we already know a lot of seasonal topics and opportunities. We’re also pretty good at stopping the press, photoshopping some animals into photos and pushing out a topical article should the chance suddenly arise.
3. Depth
It really sets you apart when you’re the most detailed and best on a given topic.
Unlike a lot of other clickbaity media covering Japan our articles are detailed and practical (if still a little clickbaity). Giving useful and actionable advice has been a key pillar in building the TokyoCheapo brand.
In the 3 nights article mentioned above, we spent a lot of time researching and putting together a very detailed itinerary complete with cost break down and maps. Going by the 80/20 principle it would seem counter intuitive to spend all that extra time getting all the last details, however in the case of our most popular articles the 80/20 flips round and the more detail you put in the bigger the pay off, it really sets you apart when you’re the most detailed and best on a given topic.
We’ve also decked out the site with custom location an mapping, meta data sections at the end of posts, so it’s easy for our authors to input the pertinent details and a consistent UX for our readers.
4. Good Content Often vs Crap Every Day
We’ve kept up a steady flow of articles since the beginning, at first two or three a week and now it’s more than once a day so now we have a huge archive of content. However, I would say quality trumps quantity, especially given that the 80/20 rule applies to our traffic – (approximately) the top 20% of our articles receive 80% of our traffic.
Though we’ve kept up a fairly steady rhythm we don’t force ourselves to publish every day, if we’ve got nothing good to say we shut up. Our focus is to put out good articles as often as we can.
5. Kitteh (and Dogz)
Sometimes our most useful articles have the most boring photos, but with a little help from doggie,
or Kitteh
things start to look a little better.
Kittens and puppies are the rocket fuel of the internet, use them properly and with care.
6. SEO Business
6.1 Proper Mobile First Responsive Theme
In case you didn’t get the memo, you need to make sure you have a good UX for mobile users or they won’t be coming to your site any more. We had a “responsive” theme since near the beginning, but it looked a little shabby for mobile users, so we threw it out and started again spending time on making sure the mobile views worked well.
We also have user agent detection in both our varnish set up and within WordPress. We use the device detection to serve mobile ads correctly, and we use our responsive framework’s show/hide classes to hide certain elements that clutter or slow the mobile UX.
6.2 Page Speed
Uncle Google tells us webmasters that we should optimize our webpages’ speed and I agree. It’s better use of technology and better UX. Moreover as you can see from the graph above, we experienced a drop in our organic traffic following a drop of the page speed ball (some cache misconfiguration that took me a month to spot).
I gave a talk about page speed and learning from running Tokyo Cheapo at UX Talk Tokyo last year, here’s a video of the slides (skip to 9:38 to jump straight to the tips):
And here’s the TLDR; takeaways from the video:
- Via Negativa – take away the crap – we turn off plugins, purge legacy javascript and css, removed all the js social media buttons and even took a screen shot of the facebook like box to make a fake one with an image (as opposed to the 300kb and 29 reuqests it took before).
- Caching – we have a fairly complex varnish setup, but a simpler approach that’ll still give you most the benefits would be setting up with Cloudflare, and (if on wordpress) installing W3C total cache plugin. If your content is a blog or fairly static you can cache the HTML as well as the assets (js, css etc)
- Combine and Minify – this means putting all your js in one single file and all your css in another. This can get quite fiddly and technical, but there’s some services (like cloudflare and the W3C total cache plugin) that will attempt to do this automatically for you.
- CDN – Content Delivery Network that is serve all your static content from a CDN. Again there’s a few services that will do this for you automagically (cloudflare, yottaa) but it’s not that tricky if you use the W3C total cache plugin.
- Fast DNS – we switched from our own (slow) DNS to Amazon AWS service Route53, most big ISP’s probably have globally distributed DNS servers. Check your DNS lookup speed if it’s more than 100ms then it’s worth switching where you host your DNS.
6.3 Fixing WordPress Woes
6.3.1 Avoiding the Slashdot Effect
Naturally we host TokyoCheapo on the cheapest servers possible, in fact the main instance that handles all the traffic is probably around about as powerful as an iPhone 6. WordPress is not optimized to run quickly out of the box, so if our caching and CDN set-up wasn’t there our puny little servers would be destroyed instantly. Even powerful servers will buckle under pressure if they get a lot of traffic and they are running an unoptimized vanilla wordpress set-up. The main points to mitigate these issues I covered above – caching and a CDN.
6.3.2 Removing Tags
One of pagespeed.io first fixes was to jettison our entire tags archive, that is all the thousands of low quality pages under tokyocheapo.com/tags/. The idea is to keep googlebot only crawling your articles and save him/her the trouble of having to crawl auto generated and duplicate content. We’d been running the site for two years before this change and actually had a bit of traffic to some of our tag archive pages, so we could not just 404 them all.
However we had over 1000 tags to trawl through and 301 redirect to appropriate articles. I whipped up a quick script using our search engine (we use Relevanassi, which is way better than the default WP search) to quickly find the closest matched articles to tags and spit this into a massive .htaccess file of redirects. I then went through the list and manually changed a few of the redirects to more suited pages.
Analytics Data showed that the tag pages do not actually get a lot of clicks. Accidentally, we also created a lot internal near-duplicate content on some keywords using the tag feature of WordPress. We removed all tags from our blog and set 301 redirects from the one page to a page that formerly had this tag applied.
6.3.3 Changing Orange Juice To Link Juice in About US
We had a humor reference and link to an article about cheap orange juice in our “about us” box in the footer. Whilst slightly funny it wasn’t that useful to visitors and we couldn’t care less about ranking for “orange juice”, so swap the orange juice link juice to a more useful and popular article (h/t to Chris Dietrich for pointing this out.).
6.3.4 Writing More Compelling Meta Descriptions
We have an editorial policy of writing an informative and hopefully catchy meta descriptions for our posts. It’s not about stuffing keywords; it’s about taking advantage of those few precious lines of copy Google (usually) shows in the search results. You could think of it as copy in an adwords advert. Would you leave advert copy to some auto-generated summary by WordPress?
6.3.5 Yoast SEO Plugin
The Yoast SEO plugin takes care of a lot of SEO basics out of the box – sitemaps, canonical urls as well as giving you handy tools for making custom meta descriptions and choosing good keywords to focus on. Even a vanilla install out of the box is already quite helpful, but as mentioned above we make use of it for manually improving title and meta descriptions.
6.3.6 Inter Linking & Smart Links Plugin
No brainer, interlinking to useful, related articles on our site and other sites is helpful to our readers and something uncle Google listens to. Our writers and editor are doing this as they add artilces, plus we use this plugin to set some rules for automatically linking certain text to specific URLs.
6.4 Some Notes On Varnish
This section assumes knowledge of varnish and HTTP caching.
Varnish is a whole subject in itself, but I leave some brief notes here for my own future reference (since I keep forgetting how it works) and those of you brave enough to stray away from the comfort of cloudflare and the like.
6.4.1 Our Varnish Set Up
I started with the varnish wiki wordpress vcl example and butchered it from there. This example VCL takes care of some basics like handling PURGE requests and skipping the cache when it sees wp login cookie:
# wordpress logged in users must always pass if( req.url ~ "^/wp-(login|admin)" || req.http.Cookie ~ "wordpress_logged_in_" ){ set req.backend = apache; return (pass); }
I simply blocked the wp-cron.php since we don’t use it:
# block the wp-cron.php if( req.url ~ "^/wp-cron" ){ error 403 "Not permitted"; return(error); }
It also drops all apache set cookies (apart from for logged in users).
# remove any remaining cookies unset req.http.Cookie;
Varnish is all about taming the cookie monster.
6.4.2 Getting WordPress, W3 Total Cache and Varnish To Play Nice
Since we use the W3 Total Cache plugin, our .htaccess now has a bucket load of cache rules particularly for static content (scripts etc) set by W3 Total Cache. One of the rules messes with the cache efficiency, so it’s been commented out:
# Header append Vary User-Agent env=!dont-vary
If you have the header set to vary per user-agent, then varnish will cache a separate copy of a page for every unique browser string. This renders the cache very inefficient, since most requests will have slightly different browser identification strings, so varnish has to pass the request to apache for pretty much every new user.
Because we need granular control over the expiry times of our content (e.g. home page for 1 hour, category page 6 hours, inividual post 2 days etc), the W3 Total Cache HTTP cache expiry setting aren’t adequate, and my work around is explained below:
6.4.3 Custom Cache Expiry Headers Using .htaccess
I’ve spent a long time wrestling with wordpress to try and get it to spit out good cache headers so it plays nicely with our varnish instance. In the end I opted for hacking around in .htaccess instead. The following code uses rewrite rules to set apache environment variables (for cache age), and then below I manually set a ‘Cache-control “max-age=xxx”‘ header, first setting a default value which then gets overwritten if my “cache_age” apache environment variable has been set.
# -------- Chris's cache control hacks -----------# # we specify resources that have special cache times - default time is below # half a day or so RewriteRule ^events/$ - [E=cache_age:43200] RewriteRule ^questions/.*$ - [E=cache_age:43200] RewriteRule ^sitemap/.*$ - [E=cache_age:43200] RewriteRule ^accommodationcat/$ - [E=cache_age:43200] RewriteRule ^business/$ - [E=cache_age:43200] RewriteRule ^business/financial/$ - [E=cache_age:43200] RewriteRule ^business/internet/$ - [E=cache_age:43200] RewriteRule ^entertainment/$ - [E=cache_age:43200] RewriteRule ^entertainment/art/$ - [E=cache_age:43200] RewriteRule ^entertainment/event-posts/$ - [E=cache_age:43200] RewriteRule ^food-and-drink/$ - [E=cache_age:43200] RewriteRule ^food-and-drink/cafe/$ - [E=cache_age:43200] RewriteRule ^food-and-drink/drinking/$ - [E=cache_age:43200] RewriteRule ^lifestyle/$ - [E=cache_age:43200] RewriteRule ^lifestyle/outdoors/$ - [E=cache_age:43200] RewriteRule ^living/$ - [E=cache_age:43200] RewriteRule ^living/household/$ - [E=cache_age:43200] RewriteRule ^podcast/$ - [E=cache_age:43200] RewriteRule ^shopping-2/$ - [E=cache_age:43200] RewriteRule ^shopping-2/fashion/$ - [E=cache_age:43200] RewriteRule ^travel/$ - [E=cache_age:43200] RewriteRule ^travel/holidays/$ - [E=cache_age:43200] RewriteRule ^travel/transport/$ - [E=cache_age:43200] # an hour or so RewriteRule ^feed/.*$ - [E=cache_age:3600] RewriteRule ^$ - [E=cache_age:3600] RewriteCond %{QUERY_STRING} ^s=(.*)$ RewriteRule . - [E=cache_age:3600] # very long RewriteRule ^wp-content/.*$ - [E=cache_age:6048000] # first a catch all default - one week Header set Cache-Control "max-age=604800" Header set Cache-Control "max-age=%{REDIRECT_cache_age}e" env=REDIRECT_cache_age # for some reaso the query string condition based rule above doesn't get changed to REDIRECT_cache_age Header set Cache-Control "max-age=%{cache_age}e" env=cache_age # -------- End of Chris's cache control hacks -----------#
6.5 Redirect Moved or Missing Pages
If you change a URL, make sure you leave a 301 redirect at the old URL, ultimately no one (especially Google) likes to land on a 404 page, no matter how many funnies it has. We brief our team not to edit the “slug” of a page once it is published, and we also check our logs and webmaster tools for 404’s that have slipped through the net.
Redirecting is simple enough, just a case of slipping one line into your .htaccess file for each URL
e.g.
Redirect 301 /old/url/ http://domain.com/new/url/
7. The Graph You Probably Want To See
And here’s an analytics graph chronicling our growth thus far:
8. Support Our Crowd Funding Campaign!
We’re running a crowd funding campaign for our Guide Book “A Cheapo’s Guide To Tokyo” please support us! You can help us with just three clicks.
And If you’re ever likely to visit Tokyo order a copy, it’ll save you a ton of money and time!
Steve @ Routes North says
Really good post with a lot of food for though. That graph at the end is especially encouraging – we launched a new travel guide to Sweden about five months ago and are hoping to follow a similar trajectory : )
Matija says
Hi there, thank you for truly amazing post. What is your honest opinion about possibility to achieve something similar on small local markets, like Slovenia How much does it affect market size to your efforts? Thanks, Matija
Chris Kirkland says
Actually the Tokyo market is very small! This is an English language blog – there’s < 100K english native expats here, and not too many more tourists so we're probably close to saturation already. The key is demand - do people want it? and is there already anyone addressing the need well?
Dan Norris says
Epic post man. The content stuff is spot on. Quality over quantity + differentiation / standing out is the key.
And the kittens. I’m seriously going to try that.
Chris Kirkland says
If you really want to add rocket fuel to your content machine, I’ll lease you the laser cats for a few hours