A Spree extension to enable downloadable products
Switch branches/tags
Nothing to show
Clone or download
Pull request Compare This branch is 1 commit ahead, 206 commits behind spree-contrib:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Spree Digital

This is a spree extension to enable downloadable products. The design goal is to keep it robust. It should survive future spree versions out of the box.

NOTE: This is still under development, but since things were falling into place, I thought I’d publish it.

The idea is simple. You attach a file to a Product (or a Variant of this Product) and when people buy it, they will receive a link via email where they can download it once. There are a few assumptions that spree_digital (currently) makes and it’s important to be aware of them. These might change, but since I programmed digital_spree over night, this is what you get ;)

  • The table structure of spree_core is not touched. Spree_digital lives parallel to spree_core and does not do any changes to your existing database, except adding two new tables.
  • The download links will be sent via email in the order confirmation (or “resend” from the admin section). The links do not appear in the order “overview” that the customer sees.
  • There should only be “live” payments. Once the order is checked-out, the download links will immediately be sent (i.e. in the order confirmation).
  • You should define a shipping method called “download” and it should be cost-free. Spree_digital will use that one when all products in the cart are digital
  • One may buy several items of the same digital product in one cart. The customer will simply receive several links by doing so. This allows customer’s to legally purchase multiple copies of the same product and maybe give one away to a friend.
  • The links will only work 3 times (but we tell the customer that it works only once). After 24 hours the links are deactivated. This should keep you reasonably free from complaints of people who are not capable of appropriately clicking on a link. They can try a whole day long, 3 times per link. The file should really be downloadable for weird customers. I understand that this is a little bit security by obscurity, but it’s better than other solutions that I’ve seen.
  • The file views/order_mailer/confirm_email.text.erb is the only thing that should need customization. But since I assume you do that anyway, it doesn’t hurt to do it when you’re using spree_digital. The reason is that the download links are added to the confirmation email to the customer.
  • A purchased product can be downloaded even if you disable the product immediately. You would have to remove the attached file in your admin section to prevent people from downloading purchased products.
  • File are uploaded to rails_root/private. Make sure it’s symlinked in case you’re using Capistrano.
  • We use send_file to send the files on download. Yes, it goes through the entire stack right now.


I assume that you already have a Rails 3 Spree application up and running. If not, the Spree Documentation will help you getting started.

To make use of digital_spree, you need to add this line to your Gemfile:

  gem 'spree_digital', :git => 'git://github.com/funkensturm/spree_digital.git', :branch => 'master'

The following terminal commands will copy the file spree_digital/db/migration/20110410134726_create_digitals.rb to the corresponding directory in your Rails application and apply the migration to your database.

  rake spree_digital:install
  rake db:migrate

This should be all there is to do.


You should go to the spree admin section and create a shipping method that has the word download somehow in its name (it should be cost-free, but it doesn’t have to). It will be detected by spree_digital. Otherwise your customer will be forced to choose something like “UPS” even if they purchase only downloadable products.


Developer Section

Table Diagram

Installation (for Developers)

Get the spree framework and spree_digital extension for it:

  git clone git://github.com/spree/spree.git
  git clone git://github.com/funkensturm/spree_digital

Go into the spree directory and run the bundle command:

  cd spree
  bundle install

Go into the spree_digital directory and do the same:

NOTE: At this point you may need to uncomment the stuff in the Gemfile before you can start developing and testing!

  cd spree_digital
  bundle install

Bring up the test application (you only need to do this whenever you fiddle around with the migrations) and then you can run the tests as you please.

  rake test_app
  rake spec

This link may be very helpful to you: http://github.com/spree/spree


Copyright © 2011 funkensturm.
Released under the MIT License
See http://github.com/funkensturm/spree_digital/blob/master/LICENSE