<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>HackerEngine is a payment-ready Rails app with Bootstrap, Stripe, and KISSmetrics.</description><title>HackerEngine</title><generator>Tumblr (3.0; @hackerengine)</generator><link>http://blog.hackerengine.com/</link><item><title>Using GitHub to deliver a paid product</title><description>&lt;p&gt;GitHub has become the de facto place to host open-source projects, for good reason. But it&amp;#8217;s also a great way to deliver code-based products to paying customers. Here are some of the reasons why we use GitHub to deliver &lt;a href="http://hackerengine.com"&gt;HackerEngine&lt;/a&gt; to our customers.&lt;/p&gt;

&lt;img src="http://media.tumblr.com/tumblr_m0xuywYdMU1qa5kd1.png" style="float: right; width: 200px; margin: 0 0 0 10px;"/&gt;&lt;h3&gt;Painless access management&lt;/h3&gt;
&lt;p&gt;Once we receive payment via Stripe, we use the GitHub API to instantly add customers to the HackerEngine repo. We are using the $25/month Organization plan, which gives us the ability to add an unlimited number of customers to the private repo. GitHub also provides a simple web interface to manually add or delete members.&lt;/p&gt;

&lt;h3&gt;Fast and easy releases&lt;/h3&gt;
&lt;p&gt;Giving customers access to the repo means fewer headaches when we need to squash a bug or push a quick release. Every commit is instantly available. Customers can be notified of new commits and see exactly what&amp;#8217;s been changed. &lt;/p&gt;

&lt;p&gt;We can also use Git branches to release in-progress or experimental work to customers who&amp;#8217;d like to act as beta testers. The time between pushing code and getting it  in front of customers is reduced to zero.&lt;/p&gt;

&lt;h3&gt;Reliable delivery of assets&lt;/h3&gt;
&lt;p&gt;Once we push code to the repo, the GitHub infrastructure handles all aspects of delivering it to customers. This may seem obvious, but the advantages of not managing the delivery of assets is huge. The GitHub infrastructure is extremely reliable, and can potentially save a lot of money over other distribution options.&lt;/p&gt;

&lt;h3&gt;Long-term customer value&lt;/h3&gt;
&lt;p&gt;At this early stage of our product, there are a number of things we&amp;#8217;d like to improve, and new features we&amp;#8217;d like to add. Since customers have permanent access to the repo, early adopters will have access to the same product as customers who purchase later.&lt;/p&gt;

&lt;p&gt;This can be a great selling point. Customer development is about finding the right fit between a product and the needs of your potential users. The young product you are offering now becomes a lot more valuable once customers are given access to all future updates. This is how SaaS works, and using GitHub to deliver a code-based product provides the same advantage.&lt;/p&gt;

&lt;h3&gt;Built-in customer support&lt;/h3&gt;
&lt;p&gt;The tools that come with every GitHub repo — pull requests, issues, and wiki — are perfect for customer support. Customers can easily point to a specific file and a specific line of code when talking about an issue, and that information is visible to all other customers. The conversation around your product becomes centralized in one location.&lt;/p&gt;

&lt;p&gt;And given how easy GitHub has made pull requests, there&amp;#8217;s even an opportunity to have customers contribute to the development of the product.&lt;/p&gt;

&lt;h3&gt;Others using GitHub to deliver paid content&lt;/h3&gt;
&lt;p&gt;We used this strategy at thoughtbot to deliver our &lt;a href="https://workshops.thoughtbot.com/backbone-js-on-rails"&gt;Backbone.js on Rails  eBook&lt;/a&gt;. It allowed us to start selling the book as soon as we began writing, and has been a big success. Ben is also using GitHub to distribute his book, &lt;a href="http://www.speakingforhackers.com/"&gt;Speaking for Hackers&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;&amp;#8230;one more thing&lt;/h3&gt;
&lt;p&gt;Since the HackerEngine site is powered by the HackerEngine product, we provide our customers with the code we use ourselves. However, we did decide to remove the code that handles GitHub integration to make it easier to explain the product to our first customers.&lt;/p&gt;

&lt;p&gt;Are you a current or potential customer who wants this functionality? &lt;a href="mailto:support@hackerengine.com"&gt;Drop us a line&lt;/a&gt; and we can push the code back into the repo.&lt;/p&gt;

&lt;p&gt;And that&amp;#8217;s the beauty of using GitHub to deliver a product.&lt;/p&gt;</description><link>http://blog.hackerengine.com/post/19350662158</link><guid>http://blog.hackerengine.com/post/19350662158</guid><pubDate>Thu, 15 Mar 2012 13:59:00 -0400</pubDate><category>github</category><category>software</category></item><item><title>Integration Tests for Stripe with Cucumber</title><description>&lt;p&gt;One of my favorite aspects of Stripe is how easy it is to test your app&amp;#8217;s integration with their service.&lt;/p&gt;

&lt;p&gt;My strategy for testing integration with Stripe is a bit more aggressive than I&amp;#8217;d usually take. Typically, when testing intgration with an external service, I&amp;#8217;d use some sort of mechanism to avoid making requests that hit their servers. I&amp;#8217;d stub responses with something lke &lt;a href="https://github.com/myronmarston/vcr"&gt;VCR&lt;/a&gt;, or use a fake, like &lt;a href="https://github.com/thoughtbot/fake_braintree"&gt;this one for Braintree&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;However, since payments are so important, and Stripe&amp;#8217;s support for a Test environment is so good, I actually have my cucumber tests hit Stripe&amp;#8217;s servers. This does slow down my suite ~10 seconds per run, but since this is how my sites make money, I want to really, really know that payments can succeed.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s what one such scenario looks like:&lt;/p&gt;

&lt;pre&gt;
Feature: A visitor's purchase is recorded on Stripe's servers
  When I sucessfully purchase a product
  Then I should be on the order success page
  And Stripe should have recorded a charge for the last order
&lt;/pre&gt;

Here are the step definitions for the steps we&amp;#8217;re interested in:

&lt;pre&gt;
Then /^I should be on the order success page$/ do
  wait_until(10) do 
    page.body.include?('successful')
  end

  current_path.should == order_path(Order.last)
end

Then /^Stripe should have recorded a charge for the last order$/ do
  last_order = Order.last
  charge_id = Order.last.stripe_charge_id
  expect { stripe_order = Stripe::Charge.retrieve(charge_id) }.to_not raise_error
  stripe_order.amount.should == last_order.amount
end
&lt;/pre&gt;

&lt;p&gt;A few things worth pointing out:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;I&amp;#8217;m using wait_until after submitting the Stripe charge. I needed this because sometimes Capybara would get confused and start looking for the page content before everything was finished loading. This happens from time to time with Capybara, particularly when javascript is involved. wait_until is superior to hard-coded sleeps because it stops waiting as soon as the block returns a truthy value.&lt;/li&gt;

&lt;li&gt;I&amp;#8217;m hitting Stripe&amp;#8217;s servers twice: first to create a charge via my payment form, and then again, verifying that the stripe_charge_id and amount I stored in my local Order record matches what Stripe has. This is just extra insurance that everything worked correctly. 

&lt;p&gt;For pretty much everything other than payment-related code, I&amp;#8217;d say it&amp;#8217;s crazy to have tests hitting an external service like this. However, Stripe&amp;#8217;s test servers are fairly fast and I only add a handful of seconds to my test suite&amp;#8217;s run time. This is definitely worth it for the peace of mind I get from knowing people can pay me.&lt;/p&gt;&lt;/li&gt;

&lt;p&gt;By the way, if you&amp;#8217;re about to integrate Stripe with your Rails app, you might want to check out &lt;a href="http://hackerengine.com/?kme=Viewed+Blog+Post"&gt;HackerEngine&lt;/a&gt; and save yourself a bunch of time. HackerEngine is &lt;strong&gt;&lt;a href="http://hackerengine.com?kme=Viewed+Blog+Post"&gt;a Rails app that you can clone with Stripe already integrated for you&lt;/a&gt;&lt;/strong&gt;. It includes a cucumber test suite that uses the steps above and more to make sure everything works correctly.&lt;/p&gt; &lt;/ol&gt;</description><link>http://blog.hackerengine.com/post/18770757049</link><guid>http://blog.hackerengine.com/post/18770757049</guid><pubDate>Sun, 04 Mar 2012 21:58:00 -0500</pubDate><category>cucumber</category><category>stripe</category><category>testing</category><category>integration</category></item><item><title>Greet every new customer at the door</title><description>&lt;p&gt;When you launch a new product, almost everything will be wrong. Your code will be buggy, the design will be rough, and you&amp;#8217;ll still be figuring out how to explain your product to customers. But there&amp;#8217;s one thing that you can do really well from day one: customer service.&lt;/p&gt;

&lt;h3&gt;Start talking to your customers as soon as possible&lt;/h3&gt;
&lt;p&gt;As you get your first trickle of customers, take the time to greet each of them at the door. Email your new customers and introduce yourself. Ask them to explain what problem they&amp;#8217;re hoping your product can solve. Open up the lines of communication as they begin to use your product. Have them tell you what they love, what sucks, what&amp;#8217;s  confusing, and what&amp;#8217;s delightful.&lt;/p&gt;

&lt;p&gt;Your first batch of customers will be bitten by all the bugs you haven&amp;#8217;t fixed yet. They&amp;#8217;re going to long for all the features you haven&amp;#8217;t implemented. They&amp;#8217;re going to be frustrated by your young, incomplete product. But rather than venting on Twitter, they&amp;#8217;ll already have an open channel of communication with you where they can turn their frustration into useful feedback.&lt;/p&gt;

&lt;h3&gt;Let your customers guide product development&lt;/h3&gt;
&lt;p&gt;Your first customers can save you the trouble of building features that no one needs. When you launch, you&amp;#8217;ll have a vision of how the product should grow. You&amp;#8217;ll be anxious to implement feature A, allow integration with product Z, make the design super slick, refactor all the code, and on and on. But those are just your guesses about what matters. Once customers start using your product, you&amp;#8217;ll likely find that they don&amp;#8217;t care at all about the features you were excited to build (they &lt;strong&gt;definitely&lt;/strong&gt; won&amp;#8217;t care if you refactor your code), but will instead ask for things that you missed entirely. Again, with an open line of communication, your first customers can provide you the insights that will let you find what pain point your product can and should solve.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve found it extremely gratifying to email the first customers of &lt;a href="http://hackerengine.com"&gt;HackerEngine&lt;/a&gt;. I want to know our first hundred customers by name. I want to understand what problem our product is helping them solve. I want to treat them as partners in building a product that can deliver extremely high value for every customer who comes after them.&lt;/p&gt;</description><link>http://blog.hackerengine.com/post/17983663812</link><guid>http://blog.hackerengine.com/post/17983663812</guid><pubDate>Mon, 20 Feb 2012 20:37:00 -0500</pubDate><category>startup</category><category>customer service</category></item></channel></rss>
