<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[thisblog.rules.io]]></title>
  <link href="http://thisblog.rules.io/atom.xml" rel="self"/>
  <link href="http://thisblog.rules.io/"/>
  <updated>2012-12-21T09:47:07+01:00</updated>
  <id>http://thisblog.rules.io/</id>
  <author>
    <name><![CDATA[]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Seeking Heroku Add-on Alpha Testers for rules.io]]></title>
    <link href="http://thisblog.rules.io/blog/2012/12/10/seeking-heroku-add-on-alpha-testers-for-rules-dot-io/"/>
    <updated>2012-12-10T13:02:00+01:00</updated>
    <id>http://thisblog.rules.io/blog/2012/12/10/seeking-heroku-add-on-alpha-testers-for-rules-dot-io</id>
    <content type="html"><![CDATA[<p>Do you have a Ruby on Rails app running on Heroku?<br/>
We need your help!</p>

<p><strong>Why?</strong><br/>
Because we wanted to offer our rules engine as a heroku add-on as fast as possible and are looking for some feedback on what we have done so far.</p>

<p>With rules.io you can connect the event data from your users with 3rd party SaaS tools like Mailchimp, Urban Airship and Sendgrid and put some logic=rules in between.<br/>
To make it more convenient we have a ruby gem available and some example rules will be added to your rules.io account once you’ve registered.</p>

<p><strong>How to participate?</strong><br/>
Send us an email with the email address from your heroku account and a short sentence that you agree to be invited to our alpha test to <strong>team[at]rules.io</strong>. You will receive an invitation from us and will be able to choose our add-on for your app on heroku by typing</p>

<pre><code>heroku addons:add rulesio:test
</code></pre>

<p>into your command line.</p>

<p><strong>You have plans to have a heroku add-on?</strong><br/>
  Let us know and we will be happy to alpha test your add-on as well!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The last gem you'll ever need?]]></title>
    <link href="http://thisblog.rules.io/blog/2012/12/06/the-last-gem-you-will-ever-need/"/>
    <updated>2012-12-06T16:23:00+01:00</updated>
    <id>http://thisblog.rules.io/blog/2012/12/06/the-last-gem-you-will-ever-need</id>
    <content type="html"><![CDATA[<p>At rules.io we have benefited from many open source projects, such as Ruby on Rails, D3, and Ember. Now we want to start giving back, with a project called <a href="https://github.com/rulesio/geekier/wiki">Geekier</a>.</p>

<h3>Background: so many APIs, so many gems</h3>

<p>It is increasingly the case that building any sort of application, be it for the web, or mobile, or desktop, means connecting to several online services via APIs. As a developer, I mostly view this as a good thing, because it means I can offload all sorts of things that I care about doing well but that aren&#8217;t central to how I provide my unique value. I want things like payment handling, exception reporting, and analytics, but I don&#8217;t want to build them all myself.</p>

<p>As a frequent consumer of APIs, I&#8217;ve looked at lots of API specs and libraries over the years. If you are an API provider, and you&#8217;re thinking about writing a client library (or ruby gem, or python egg, or &#8230;) then I have one piece of advice for you: don&#8217;t do it.</p>

<p>For every worthwhile API out there, there&#8217;s at least a handful of Ruby gems I can choose from. And often, they all suck. I&#8217;m sick of reading the docs, looking over the code and tests, examining the dependencies for troublemakers, checking to see if issues are being addressed, etc, etc.</p>

<h3>Give me data, not code, please</h3>

<p>When we started building rules.io we knew we would be talking to <em>lots</em> of APIs, and we knew that was going to become painful unless we took drastic action. So we adopted a data-driven approach. For each API we integrate we don&#8217;t pay any attention to whatever gems may exist; instead, we read the documentation and create a YAML file that describes how the API works.</p>

<p>This has worked out great for us. We have a single library called Geekier (based on <a href="https://github.com/technoweenie/faraday">Faraday</a>) that works off of these API descriptions to connect to all of the APIs we care about. Any effort we put into Geekier &#8211; to do better parameter validation, or logging, or error reporting, for example &#8211; gives us value across all of those APIs.</p>

<h3>Where we&#8217;re going</h3>

<p>The next step in making this more awesome would be for more of us to share this perspective on how to work with APIs, and for the community to start sharing these API descriptions. This would be a big win for everyone using APIs.</p>

<p>This will also be a big win for API providers. If your API is so complex in its behavior that it can only be fully and accurately described with client code that you write by hand, you&#8217;re doing something wrong. Instead, if you describe your API with data rather than code, then as your API evolves, you won&#8217;t have to update and maintain a set of client libraries in various languages. You will simply create a new API description for the new version, and all of the clients will immediately be able to use the new API, regardless of whether they&#8217;re using Javascript, Ruby, Python, Java, Scala, etc.</p>

<p>To help move this along, we&#8217;re working on extracting Geekier from rules.io so that we can release it as its own open source gem. We&#8217;re also moving from our own homegrown API description language to an emerging standard: <a href="https://github.com/wordnik/swagger-core/wiki">Swagger</a>.</p>

<p>Is <a href="https://github.com/rulesio/geekier/wiki">Geekier</a> the last gem you&#8217;ll ever need? No, but it will help.</p>

<p><strong>Update:</strong> Join the ongoing discussion in the <a href="https://groups.google.com/forum/?fromgroups#!forum/geekier-apis">geekier-apis google group</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[WhenAUser becomes rules.io]]></title>
    <link href="http://thisblog.rules.io/blog/2012/09/15/rules-dot-io/"/>
    <updated>2012-09-15T08:50:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/09/15/rules-dot-io</id>
    <content type="html"><![CDATA[<p>We&#8217;ve been busy this summer, but not busy blogging. We owe you an update.</p>

<p><a href="https://rules.io">rules.io</a> is our new home. Whether you&#8217;ve known us as WhenAUser.com or traction.io, rules.io is now <em>the</em> place for all our products and technology.</p>

<p>You&#8217;ve been asking us to do a few things: make it easier to get started with our technology, and offer more value out the box. We&#8217;re learning we can do this best by focusing on specific developer platforms, and we are excited to announce the availability of the <a href="https://github.com/rulesio/rulesio">rulesio</a> gem for Ruby web app developers as our first step in this direction. It only takes minutes to add our gem to your application, and it provides immediate access to our entire catalog of solutions.</p>

<p>Along with the Ruby gem we are launching three initial solutions: <a href="https://rules.io/solutions/er">Exception Reporting</a>, <a href="https://rules.io/solutions/buxr">Bad User Experience Reporting</a>, and <a href="https://rules.io/solutions/us">User Segmentation</a>. These solutions cover core use cases explored by users of our private beta. Each is implemented as a combination of Rules and Workflows/Funnels in our rules engine &#8211; they are out-of-the-box ready, but can then be modified and customized in very interesting ways. Future articles will describe some of the possibilities in much more detail, so stay tuned.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[WhenADemo]]></title>
    <link href="http://thisblog.rules.io/blog/2012/06/22/whenademo/"/>
    <updated>2012-06-22T17:50:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/06/22/whenademo</id>
    <content type="html"><![CDATA[<iframe title='EyeEm slideshow' width='354' height='360' src='http://www.eyeem.com/slideshow2/iframe.php?stream=305312&limit=20' frameborder='0' allowfullscreen></iframe>


<p>On Wednesday we had a great evening at Berlin Tech Meetup where I gave a demo of what we do and a short talk on challenges we&#8217;re facing. More on this plus a video of it after the weekend.</p>

<p>For now, here&#8217;s a fun part we had planned with our friends at <a href="http://www.eyeem.com">EyeEm</a> for the meetup that didn&#8217;t really work out, because of an overloaded wifi.</p>

<h2>This is how it works:</h2>

<ul>
<li>Get the EyeEm app on your phone</li>
<li>take a photo of somebody</li>
<li>tag it with WhenADemo</li>
<li>wait a minute</li>
<li>hilarity!</li>
</ul>


<h2>This is how we did it:</h2>

<p>Together with EyeEm we turned the photo updates of one of their albums into an event stream, WhenAUser will understand. Then we created a rule that for every photo update event, uses the photo URL and mustachifies it with <a href="http://mustachify.me">mustachify.me</a> (which is powered by <a href="http://face.com">face.com</a>) and upload it back to EyeEm. We also title it &#8216;mustachified!&#8217;.</p>

<h2>This is why we did it:</h2>

<p>Because we can, that&#8217;s why!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[]]></title>
    <link href="http://thisblog.rules.io/blog/2012/06/22/"/>
    <updated>2012-06-22T09:06:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/06/</id>
    <content type="html"><![CDATA[<p><img src="http://thisblog.rules.io/images/yammer.png" width="500"></p>

<p><strong><em>&#8220;With great power comes great responsibility.</em></strong> &#8221;</p>


<p>&#13;</p>

<p>Automated retention messages can be fantastic for user loyalty leading to greater revenue&#8230; but they can also be abused. With <a href="http://whenauser.com/">WhenAUser</a> we can help you make sure that your messages reach only the right people at the right time without spamming the user. </p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Berlin meets Boulder]]></title>
    <link href="http://thisblog.rules.io/blog/2012/05/23/berlin-meets-boulder/"/>
    <updated>2012-05-23T18:54:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/05/23/berlin-meets-boulder</id>
    <content type="html"><![CDATA[<p>Today is the first day of <a href="http://gluecon.com/2012/">GlueCon</a>, the web application integration conference in Boulder and our team of WhenAUser.com has the honor of representing Berlin there!</p>

<p>WhenAUser.com was selected out of hundreds of applicants as one of only twelve companies to demo their products in the DemoPod competition. Check out our <a href="http://www.whenauser.com/gluecon">GlueCon Demo Funnel</a> to see what&#8217;s going on and become part of the expericence.</p>

<p>If what we do is exciting to you, if you want to support the Berlin Startup community, if you feel like a young Berlin tech company definitely deserves to win the DemoPod competition, support us with your vote, by texting &#8216;8&#8217; to +1 (484) 652 8683 (powered by Twilio)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Vote for WhenAUser]]></title>
    <link href="http://thisblog.rules.io/blog/2012/05/23/vote-for-whenauser/"/>
    <updated>2012-05-23T18:42:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/05/23/vote-for-whenauser</id>
    <content type="html"><![CDATA[<p><img src="http://thisblog.rules.io/images/gluecon.jpg" width="200"></p>

<p>Support a young Berlin tech company in the <a href="http://gluecon.com/2012/">GlueCon</a> DemoPod competition, by texting &#8216;8&#8217; to +1 (484) 652 8683</p>

<p>(powered by Twilio)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Event Sourcing Use Cases Part 1]]></title>
    <link href="http://thisblog.rules.io/blog/2012/05/15/event-sourcing-use-cases-part-1/"/>
    <updated>2012-05-15T16:31:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/05/15/event-sourcing-use-cases-part-1</id>
    <content type="html"><![CDATA[<h3>Post Mortem</h3>

<p>This is the first use case I want to talk about.</p>

<p>Say, something went wrong in your app and as a result, a user gets blocked for abuse but that user claims to not have done anything to break rules. Now you can go back to your staging environment and play the events leading up to the block in that system and see what happens first hand.</p>

<p>What’s needed for this is a comprehensive log of events for basically any interaction that happens around your app and a staging system to replay events to. Based on the sensitivity of your data you may want to anonymize some details before hand but that’s about it.</p>

<h3>Testing Bug Fixes</h3>

<p>This one is somewhat similar to a Post Mortem in that you take data out of the live system’s event source.</p>

<p>When a bug occurs, you can just grab a record of the last events that led up to the incident and extract those. Once the bug is fixed and deployed to a testing or staging environment, you can replay that portion of events and see if the bug shows up again. It’s even possible to collect several sets of events and run all of those.</p>

<h3>Replication</h3>

<p>When you have an event log and want to move the app environment to a new system, you can just replay the whole log there and it will be up to date with the old system. This can even be done in a multi master setup where both servers keep each other in sync, until the transition is complete and you want to shut down the old server.</p>

<p>I hope this gives you some ideas, what can be done with even sourcing. More on this soon.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Events and Event Sourcing]]></title>
    <link href="http://thisblog.rules.io/blog/2012/05/10/events-and-event-sourcing/"/>
    <updated>2012-05-10T16:47:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/05/10/events-and-event-sourcing</id>
    <content type="html"><![CDATA[<p>What’s event sourcing?</p>

<p>We talked about <a href="http://thisblog.rules.io/blog/2012/04/25/we-event-stream-processing/">events and what it means to record them</a>. Once you record events, you can also use this event log as a source for data. You can reconstruct the state of your application at a certain point in time, undo changes, insert things into the timeline and see how it affects later states or pick specific events and run them again.</p>

<p>There are lots of use cases for event sources and today I want to tslk about one you likely already are familiar with, but might not have expected to belong to this topic: source code management.</p>

<p>SCMs like GIT manage a list of file changesets (events) that are applied in a certain order to form the current state of the working copy. You can go back in time, fork the repo, insert changes, undo commits and cherry pick changes from history or other branches.</p>

<p>So, what about it?</p>

<p>Now I ask you to keep in mind this picture of a repository being a timeline and think about how often you go back, review changes, undo stuff that happened and perhaps even inserted changes to alter the history of what you’re looking at right now. Doesn’t this feel like time travel?</p>

<p>We all know the great responsibility that comes with the power of this kind of event stream, but also the possibilities that go with it. Those possibilities could be transferred to your use of data, if you made use of event sourcing for this.</p>

<p>I will talk about several of those use cases in the future so stay tuned, if you’re curious.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[We ♥ event stream processing]]></title>
    <link href="http://thisblog.rules.io/blog/2012/04/25/we-event-stream-processing/"/>
    <updated>2012-04-25T23:06:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/04/25/we-event-stream-processing</id>
    <content type="html"><![CDATA[<p>For the technical team, event streams are at the heart of what we do here at traction.io. Now until recently, event stream processing was a rather esoteric topic, seemingly not having a great deal to offer the average web developer. So why do we find this so interesting?</p>


<p>&#13;</p>

<p>You may have noticed that event streams are playing an increasingly important role in the architecture of major web platforms, such as Facebook, Twitter, LinkedIn. For these big applications, the motivating use cases for event stream processing are advanced features such as detecting fraud, identifying trending topics, and generating personalized recommendations. </p>


<p>&#13;</p>

<p>Most SaaS product teams aren’t building something on the scale of Facebook, or LinkedIn, but event streams can be useful for almost any web application. To demonstrate why, here are some simple examples (while we use JSON for all of our events, I wrote these examples in pseudo-English to make them easier to follow):</p>


<p>&#13;</p>

<pre>customer47 viewed product12&#13;
customer47 added product12 to shopping cart&#13;
customer47 viewed check-out page&#13;
customer47 viewed shipping-charges page&#13;
... <em>1 day later with no payment recorded</em> ...&#13;
<strong><em>customer47 has abandoned their shopping cart</em></strong>&#13;
</pre>


<p>&#13;
&#13;</p>

<pre>snidely.whiplash@villains.org created an account&#13;
snidely.whiplash@villains.org logged-in&#13;
snidely.whiplash@villains.org followed user123&#13;
snidely.whiplash@villains.org followed user456&#13;
... <em>after following many more in a short period of time</em> ...&#13;
snidely.whiplash@villains.org unfollowed user123&#13;
snidely.whiplash@villains.org unfollowed user456&#13;
... <em>after unfollowing many more in a short period of time</em> ...&#13;
<strong><em>snidely.whiplash@villains.org is a suspicious character</em></strong>&#13;
</pre>


<p>&#13;</p>

<p>Both of these examples involve a simple pattern of behavior, leading to a conclusion with important implications for your business. We’re building WhenAUser to help you not just detect, but also to take action when these things occur.</p>


<p></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[From Traction Labs to traction.io and WhenAuser: 10 Months of Exploration and Validation]]></title>
    <link href="http://thisblog.rules.io/blog/2012/04/21/From-Traction-Labs-to-WhenAUser/"/>
    <updated>2012-04-21T09:44:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/04/21/From-Traction-Labs-to-WhenAUser</id>
    <content type="html"><![CDATA[<p>My co-founders and I have spent most of the past 3 years working very closely together. We were first part of the core leadership and developer team building a cloud management platform for another German company. Things shifted rather suddenly in that company last Spring and we found ourselves needing to take a step in a new direction.</p>

<p>We were working deep in the cloud stack at that time (IaaS). But, we realized that the real major action was happening a couple of levels above in SaaS. And, as we explored our respective future options, we knew we were great as a team. We trusted each other implicitly (really HUGE deal) and shared a strong vision in wanting to build a world class software company - something big and lasting. With an agreement to spend time exploring and learning as we built and tested product ideas, we launched Traction Labs last summer.</p>

<p>We initially began by developing key projects for a few other funded startups to keep us warm and fed. But, in our hearts we knew were were a product team. So we ran down rabbit holes, created and tested theories, developed iterations of software ideas and spent many an hour in deep passionate &#8216;discussion&#8217; on the &#8216;what, who and why&#8217; of our team. We even focused in on one product called TractionStream, a sort of unified inbox for business SaaS tools. But, we found ourselves unhappy with the progress and feedback from beta users of that product. So, in early 2012 we decided to kill it completely.</p>

<p>But, we had learned some things, explored the SaaS integrations market more deeply and found an exciting direction in which to direct our newfound wisdom. After spending about 9 months exploring and validating the entire problem space around SaaS adoption, early in 2012 we dialed in our focus.</p>

<p>As we now are going down a very clear path with exciting early market validation, we decided to change the name to traction.io. Our first product coming out is called <a href="http://whenauser.com/">WhenAUser</a> &#8211; <strong>a simple rules engine for automating user retention and user engagement for web and mobile software teams</strong>.</p>

<p>We have a new company, an exciting early product, deep knowledge from our years of experience and the invaluable process of exploration over the past months. <strong>#happy</strong></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[]]></title>
    <link href="http://thisblog.rules.io/blog/2012/04/16/"/>
    <updated>2012-04-16T07:44:00+02:00</updated>
    <id>http://thisblog.rules.io/blog/2012/04/</id>
    <content type="html"><![CDATA[<blockquote><p>When a user hasn’t completed funnel step 3 after 2 weeks,
send them retention email #3 - &#8220;Can We Help?&#8221;.</p></blockquote>
]]></content>
  </entry>
  
</feed>
