Of course we got it wrong


the internet was always going to be disruptive

Maybe we should listen to Alan Watts a little more.

kindly let me help you or your ill drown, said the Monkey, putting the fish up a tree

Of course we got it wrong. That’s pretty much the default outcome. It’s how evolution works. The danger is in refusing to recognize when it’s been gotten wrong and simply continuing down the same paths that lead us to ruination and displeasure.

Hubris and Legacy

Hubris and Legacy are twin faces of the same illness, an inability to take joy from the present. Both depend upon a future in which one is the center of the story and no longer in the story. Selfies are misunderstood in this way. While yes they represent and artificial view of the subject, how much worse is this than the pretentious drivel we all wrote in our journals as teenagers? What you leave behind is based on what you do now. And the doing of it seems to be the point of it, not the telling about the doing of it.

Coercive UI

Please Don’t Go

I love to optimize a funnel as much as the next guy. Working at Airhelp as the CIO, I’ve seen our VP of Product do some amazing things to help conversion, and reduce drop-off post user acquisition, some of it is a little clever but in general we stay away from Dark UI because our customers have told us that trust is one of the things they look for most in our service.

I recently realized that we were still paying for Hulu.com when we never watched it, and I decide to cancel it. While I really respect the gumption required to push the envelope to the far edge of profitability (I can only imagine the results of A/B testing these cancellation funnels: “We reduced the cancellation rate by .5% which translates into 45M ARR!”), I really get a kind of sick taste in my mouth from this cancellation funnel.

It’s not clear what the benefit of putting your subscription on-hold is for the consumer. For Hulu, it’s clear because you’ll forget you put it on hold, and they’ll at least get one more credit card cycle charge when they take it off hold before you cancel again. But that’s fine. Nice try. Please don’t go.

some options, is this a user survey?

And now I’m offered some choices. That’s okay too, it feels like standard user research. What the hell, I’ll push one extra button. (I also notice how they cleverly default to I’ll be back — a second try at getting me to put the subscription on hold. Still no clue why I’d do that. But okay)

upsell showtime

I’m not going to buy show time, but now I’m curious, what other opportunities to upsell does this frigging funnel have? They really don’t want me to cancel do they?

this was the user survey I expected and wouldn’t mind

Someone must have detected that too many users were cancelling due to not getting the product to work, so this makes a lot of sense. Don’t let your customers quit you when they’re angry. Make sure you try to solve their problem first. But I wasn’t having any technical issues, so I said I didn’t like Ads. And they asked me to update my plan.

Ok, now I’m feeling a little tricked

Another upsell. I have the basic plan, which shows me ads. Hulu no longer offers a freemium product (unlike Spotify). You pay either way, you just pay more for Ad Free content.

The Too Expensive choice comes with a Bribe.

I almost considered taking the free month. After all free is free right? But I know myself, and if I don’t cancel now, I’ll be right back here next month, after they charge me $8 again.

I’m not evangelizing against coercive UI, but I know for certain that it’s not how I want to build products. What are your thoughts? Is this clever optimization for Key Metrics? Or is this a kind of UI Cyberbullying?

Sold 2003 Landrover Discovery II $1900



If you don’t know this vehicle stop reading.  She’s not for you.  Landrovers don’t leak oil, they mark their territory.  This one has seen a lot of love.  Pictures below.

Work I’ve done in the last 2 years:

New Head Gasket and the entire Engine Seal Rebuild.

Basically this kit from Atlantic British:
Land Rover Discovery Head gasket Set






New Battery, New Starter Motor, New Alternator, New (refurbished radiator), New (refurbished) steering pump, A/C Refrigerant Refresh, New Thermostat, New Coolant Reservoir, Replaced front main driveshaft couple, New Plugs and Plug Wires (The good kind).

Continue reading “Sold 2003 Landrover Discovery II $1900”

I married a designer

I tend to take for granted how ‘beautiful’ the spaces I am living in are.  And I get frustrated when she spends so much time planning the way a room will look, and then I’m reminded, just how good she is at design.

Rspec Candies and Cookies

it "include_hash tests nested hashes" do
{ foo: ‘a’, bar: {nested_hash: {fi: ‘c’, baz:’b’} }}.should include_nested_hash(nested_hash: {fi: ‘c’, baz:’b’})

Combining Mandraka’s  Rspec Candy with this little find from CookiesHQ, led me to a nested hash matcher

Very useful for testing API responses.

[ruby toolbar=”true”]

def find_first_value_for(hsh, key)
return hsh[key] if hsh[key]
hsh.values.each do |hash_value|
values = [hash_value] unless hash_value.is_a? Array
values.each{ |value| return find_first_value_for(value, key) if value.is_a? Hash }

RSpec::Matchers.define :include_nested_hash do |expected|
match do |actual|
if !actual.nil? and expected.is_a? Hash
if expected.keys.count > 1
keys.map do |key|
value = find_first_value_for actual(actual, key)
!value.nil? ? {key.to_sym => value} : {}
elsif expected.keys.count == 1
{expected.keys.first => find_first_value_for(actual, expected.keys.first)}
!actual.nil? && result == expected

Just include it in your spec_helper.rb or custom matcher module then test with something like this:

[ruby toolbar=”true”]
context "when testing with rspec candy" do
it "include_hash is available" do
{ foo: ‘a’, bar: ‘b’ }.should include_hash(foo: ‘a’)
it "include_hash tests nested hashes" do
{ foo: ‘a’, bar: {nested_hash: {fi: ‘c’, baz:’b’} }}.should include_nested_hash(nested_hash: {fi: ‘c’, baz:’b’})

Email hack from angelist angel.co

Very often I receive or send an introduction email to two parties, either for a general introduction or to help solve a specific problem. Usually it’s the two parties being introduced who need to chat, and not me. So I do what I’ve seed to be the common pattern and asked to be moved to bcc so that when they hit reply all I am taken out of the chain. I also do the same when someone introduces me, and It’s clear that the introducer shouldn’t be in on the continuing email chain.

Here’s an example:

Intro Email pattern

Today however I received an intro email from angel.co (Angle list’s return email) and in the email they did something very clever. their email is below. When I hit reply all (which I did lazily as a guaranteed way to include the other person in the email) there was no sign of the angel.co address in the to or cc fields.

intro email that doesn't include sender's email in the reply-to field

They did this by manipulating the reply-to header in the email chain. It may be an old hack or an old trick, or even part of the design of the email standard to begin with. But I’ve never manipulated the reply-to field before and this is absolutely a great way to handle emails connection between two users. Not only is the other part in the email chain, and the send is not on reply-all, it also works for regular reply. Here is an edited version of the headers. I also noticed that mail was processed by SendGrid, so maybe this is actually a feature of sendgrid’s email management service, but in any case, I think it’s brilliant and clever.

Subject: Intro - Ashley, Someone (Example Company)
From: AngelList Talent <talent@angel.co>
Date: 1/16/14, 3:05 PM
To: Ashley@Raiteri.net, someone@example.com
Return-path: <bounces+13051-3f53-ashley=raiteri.net@send.angel.co>
Envelope-to: ashley@raiteri.net
Delivery-date: Thu, 16 Jan 2014 18:05:17 -0500
Received: from o1.send.angel.co ([]:55752) by ...
Received: by mf227.sendgrid.net with SMTP id mf227.26522.52D865A98 Thu, 16 Jan 2014 23:05:13 +0000 (UTC)
Received: from angel.co (ec2-50-18-6-138.us-west-1.compute.amazonaws.com []) by ismtpd-026 (SG) with ESMTP id 1439d4d1dc8.12bc3.5ed92 Thu, 16 Jan 2014 23:05:13 +0000 (GMT)
Reply-To: Ashley@Raiteri.net, someone@example.com
Message-ID: <52d865a95d6ac_e2638aff4444aa@job01.tmail>

X-Spam-Flag: NO
Reply-to: Ashley@Raiteri.net, someone@example.com

New match: Introducing Ashley to PersonName at Example Company
You're both cc'ed on this email. You should both reply and set up a time to connect.

Ashley Raiteri
Technical Advisor on Scalability, Data Science, Product and Funding

Ruby CSV write to a file – Gotcha!

Unlike the beautifully concise and familiar 1 liner of code to dump a document to a text file:

[ruby toolbar=”true”]File.open(local_filename, ‘w’) {|f| f.write(doc) }[/ruby]

The ruby csv library requires quite a bit more typing, and the documentation for it is easy to misunderstand.

One of my primary needs, is often data wrangling.  Changing the contents of a csv file for use in another framework, whether it’s reverse coordinates, stripping unwanted columns, or adding needed columns to the data, and I always trip up on how to dump the changed CSV after manipulating it.

As a reminder to myself, and maybe a hint to others, I’ve include the proper way to dump out your arr_of_arrs, once you’ve manipulated it as you will,

[ruby highlight=”4″ toolbar=”true”]CSV.open(newfilename, &quot;w+&quot;,
:write_headers =&gt; true,
:headers =&gt; arr_of_arrs.headers) do |csv|
arr_of_arrs.each{|row| csv &lt;&lt; row}

The important bit is remembering to do an each loop of your arr_of_arrays object. This for instance will not produce the desired results:

[ruby highlight=”4″]CSV.open(newfilename, &quot;w+&quot;,
:write_headers =&gt; true,
:headers =&gt; arr_of_arrs.headers) do |csv|
csv &lt;&lt; arr_of_arrs

Bone Yard for Travel Startups

My personal math has the Travel Startup success rate at lower than 1/2 of 1%.

I’m calculating over 1000 travel startups in the last decade with less than 50 ‘successful’ startups.

The rate for Big Time success is even lower maybe 1/10 of 1%


It may be too early to tell, but I essentially agree with this post on Pando Daily from a few months ago.  Travel was one of the early candidates for a market that could be disrupted by the creation of the Internet.  There are several very profitable companies that have fundamentally monopolized the space.  In the US Market, there is Expedia (created by Microsoft in partnership with GDS’s) 1996.
Orbitz.com (created by United Airlines, Delta Air Lines, Continental Airlines & Northwest Airlines in 1999).  Two of Orbitz’s founding creators no longer exist.   Travelocity.com  was created by Sabre (a GDS) which was wholly owned by American Airlines at the time.  Priceline.com was founded by Walker Digital (a very successful company with over $300M in revenues in 1998).  
So of the big 4 Online Travel Agencies in the US, none  represents what we typcially consider a startup, and 2 were actuall existing players in the market just shifting from offline to online.

If you look at the last decade, there a few very successful companies but very few that started in a dorm room.  Kayak was started by Paul English (an exec at Intuit) and Steve Hafner who was part of the original Orbitz team.  They started with a ton of funding and industry experience.

ITA Software was essentially a true startup.  It slogged along in the “Might Make it” status for 15 years before getting snatched up by Google.  Granted they had > $100M in revenues and > $200M in funding for many of their final years, but with a limited supplier chain and colossal failures in attempting to scale from Shopping Engine to PSS provider there was never going to be any future other than an acquisition for ITA.  Still an $800M acquisiton deal is clearly a SUCCESS.


Tripadvisor.com (11 years since founding) certainly meets the criteria.

As does Tripit.com which was acquried for $120M by Concur.

Farecompare has done very well (founded by Rick Seaney & Graeme Wallace from work they did at Hotels.com)

There’s also Farecast (founded by Oren Etzioni) purchased by Bing.

Flightcaster (Evan Konweiser, ex-kayak staff member) was purchased by NextJump.  I’m not sure NextJump is successful, but I guess I count this as a good exit.

Portland based Flightstats.com (a Datalex spin-out) seems to be doing quite well.

More recently there is Gogobot (too soon to tell whether it will last, but it has strong user growth)

And of course there is star-studded Hipmunk.com


Sidestep and Swoodo, both acquired by Kayak can probably also be considered true startups that succeeded by getting acquired. ($200M for Sidestep, unknown for Swoodo).  But now we’re venturing outside the US Market where there are a few other notables:

 Cheapflights.com (founded in 1996)

 Skyscanner (11 years in the making, started on the backs of 3 guys, 2 of whom kept their fulltime jobs for a while)

Danish born Momondo, (6 years old),

Maybe you can count Datalex (founded in 1985) but they don’t really fit the criteria of a start-up

There are many more notables like ClearTrip.com from India, but the point I’m trying to get it is this:

In just 2010-2011 Tnooz lists in excess of 300 startups in the travel space, only Gogobot and Hipmunk from that era are surviving at any significant level of success.

The era of the Travel startup may be over.  The cost of creating a startup in other areas is just too low, and trying to disrupt the travel space without serious connections and money is seeming less and less likely.  I’m not sure if developers will ever stop trying to tackle this space, but it’s certainly beginning to seem less and less likely that they will succeed.

Want to mention some other companies that you think qualify as ‘successful’ travel startups?  Send me a note or comment and I’ll update my post.