Prixfeed Earns Its Keep (Almost)

First revenue ever from Prixfeed, my RSS-of-Amazon-prices app, arrived in my email today in the form of an Amazon gift certificate:

prixfeed

While not exactly retiring yet, I’m pretty proud of this little app. Very simply done, no marketing to speak of, barely Googleable, it somehow managed to attract users. Not many – but those who find it do seem to actually use it. It’s the micro web app: a single page contains the whole UI, an API of sorts (returns microformatted RSS) and now even a revenue source :)

Prixfeed.com and Design Decisions

I spent some time recently polishing the old “Amazon price feed” project, and gave it its own domain: Prixfeed.com (pricefeed.com was, naturally, taken). Basically what it does is take an Amazon product (by its page URL or ASIN code) and returns an RSS feed of its price. This lets users keep a watch on the price, getting updated whenever it changes.

Always liked 37signals‘ Design Decisions posts, so here are a few I made with Prixfeed, mostly to keep it simple and minimum-effort as possible (BTW, where it says “RSS Reader” I refer to the software reading the RSS feed, not the person using that software):

  • One URL:

    http://prixfeed.com/?ASIN=<Amazon ASIN or product URL> returns the RSS feed.
    (Or, with URI Templates: http://prixfeed.com/?ASIN={ASIN} )

    http://prixfeed.com/ without params will display a form where the user can enter an Amazon ASIN code or product URL, which then directs to the its RSS feed.

  • No cron jobs: Prixfeed simply checks a product’s price whenever the above URL is called (naturally, some caching is needed here to guard from buggy/malicious clients overloading it). This means data refresh is timed and triggered by the RSS readers, removing the need to build a backend update system or keep track of what data needs to be – ie, which products are currently monitored. Which leads to:
  • No database: so no need to keep track of who’s tracking which product, but with a non-RSS system (eg. email alerts) you’d still have to store prices in order to guarantee you’re only sending out a message when the price has changed. RSS, though, has a guid element which lets an RSS reader determine whether an item was read before. By making that GUID a function of the price, Prixfeed makes sure the RSS readers will display only new prices as new items.
  • Machine readable: it’s easy to programatically create a Prixfeed URL request for an item price, but I wanted to make the response machine-parseable as well, while keeping it human-readable. One way would be to have a URL param that will return an XML response, but I like the minimalism of a single URL so I decided to use a Microformat-like approach. The response’s description element contains HTML which includes attributes like id="price" etc that allow automatic parsing of the content (more details here).
  • Small output: each message contains the text “The Amazon price for <item> is now $x” and a purchase link. I like minimum friction products – there should be some proportion between the value you’re getting from something and the investment it requires you to put in, both when entering information and reading it. Since the value here is less than life-changing, I figured I better keep the time investment minimal as well.

That’s it then – once again I manage to write a blog post with more lines than the code its about! Go on and RSS thy Amazon purchases!

RSS, XML, Microformats III: Amazon Pricefeed

I put up a new small project now, pricefeed. Basically it creates an RSS 2.0 feed of an Amazon product price, so it can be used for tracking price changes – for example, you want to get a 60GB video iPod but it’s too expensive for you, you use pricefeed to create a feed for this price and then get alerted when it changes.

The RSS <description> field contains a microformatted text (sort of, I just hacked it out since there’s no standard microformat for product information yet) that can be read by the user or parseable by another app. The user sees:

Amazon price for Apple 60 GB iPod with Video Playback Black is now $379.95

Go to Amazon product page

And to a parser it would look like:

<span class="amazon">
<p>Amazon price for <span class="title">Apple 60 GB iPod with Video Playback Black</span> is now $<span class="price usd">379.95</span></p>
<p><a class="url" href="http://www.amazon.com/exec/obidos/redirect?tag=niryarivnet-20%26link_code=xm2%26camp=2025%26creative=165953%26path=http://www.amazon.com/gp/redirect.html%253fASIN=B000A3WS8O%2526tag=niryarivnet-20%2526lcode=xm2%2526cID=2025%2526ccmID=165953%2526location=/o/ASIN/B000A3WS8O%25253FSubscriptionId=1CT3AJ9HV6EQ0AG1RZ82">Go to Amazon product page</a></p>
</span>

The idea is to delegate as much as possible to the feed reader. For example, there is no database – the price is checked and feed generated when the feed readers access it. Thus no need for cron jobs either. To guarantee new content appears only if the price has changed, the item GUID is based on the price – so the feed reader will only display a new item if the price has changed. A user can look at previous items of the feed and get price history.

Since this is sort of an RSS Tap where new content is quite infrequent, I figured it made sense to allow easy sign up to get notifications via email with RssFwd (my own RSS->Email is running out of quota, and wanted to stick to “no database” ;)). I like being able to sign up and then forget about it, just get an email when there’s new information.

Well, just a little app. Hopefully it demonstrates what I meant in the last few posts and might even be a useful service for some people. I put it up now – please let me know if you run into any issues. (PS: it’s a little rough usablity/looks-wise, it’s more of a proof of concept – so no rounded corners here, yet ;))

UPDATE: Pricefeed is now at Prixfeed.com. RssFwd has been removed for now since the UI depended on XSLT, which Firefox now ignores – you can still use it with the feeds, but it’s not in the UI. Lastly, the iPod URL in the example wouldn’t return a price, since this product is no longer sold as new – the format described remains the same, for example: http://prixfeed.com/?ASIN=0596101880