Sinatra module for selling digital goods
Ruby JavaScript CSS
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Boutique is a Sinatra app for drip emails (and soon-to-be product checkouts). Still in development!


$ gem install boutique

Setup a file and run it like any other Sinatra app:

require 'rubygems'
require 'boutique'

Boutique.configure do |c|
  c.error_email    ''
  c.stripe_api_key 'sk_test_abcdefghijklmnopqrstuvwxyz'
  c.download_dir   '/path/to/download'
  c.download_path  '/download'

  c.db_options(adapter: 'postgres', host: 'localhost',
    username: 'root', password: 'secret', database: 'boutique')
  c.email_options(via: :smtp, via_options: {host: ''})

Boutique.list('learn-ruby') do |l|
  l.from   'Hugh <>'
  l.emails '/path/to/emails-dir'
  l.url    ''

run Boutique::App if !ENV['BOUTIQUE_CMD']

Stick this in your bashrc or zshrc:


Now setup the database tables (assuming you've already created the database and credentials) and stick the .css and .js files in your project. Note that boutique.js is dependent on jQuery.

$ bin/boutique --migrate
$ boutique --assets
   new -- boutique.js
   new -- boutique.css
$ mv boutique.js boutique.css /path/to/project/assets/.

Drip Emails

Emails can be written in any templating format that Tilt accepts. Stick them in /path/to/emails-dir (configured above in Emails use front-matter YAML for passing information to Boutique. The required fields are day, subject, and key. The day is how many days should pass until the email is sent. The key is a unique key assigned to each email to guard against sending multiples to the same recipient. You'll also have access to three local variables:

  • subscribe_url - URL to open subscribe UI
  • confirm_url - URL for double opt-in confirmation
  • unsubscribe_url - URL to unsubscribe in one click

Here's an example email:

day: 1
subject: First Email
key: first-email


This is the first email in the series.

- Hugh

[Click here to unsubscribe.](<%= unsubscribe_url %>)

This will be in the file /path/to/emails-dir/ Based on the file extensions, Boutique will run it through ERB first followed by Markdown.

Also note, the directory should contain a special zero day email. This is the email used to confirm when a new person signs up, also called the double opt-in email:

day: 0
subject: Please confirm your email address
key: confirm-email


Thanks for signing up.  But wait, you're not done yet!  Please
[click here to confirm your email address.](<%= confirm_url %>)

If you subscribed or received this email by mistake, please feel free to
ignore it.  You will not receive any further emails.

- Hugh

Emails are sent out using the command line tool boutique --drip. This should be run everyday. It's idempotent, so it's fine if it gets run multiple times a day by mistake. Use cron to schedule drips:

$ crontab -e
0 8 * * * boutique --drip

Rack Extensions

I recommend using these extensions in production:


Run all tests with rake.

Run individual tests with ruby path/to/test.rb or rake TEST=path/to/test.rb.

To start the server for local development:

$ BOUTIQUE_DEV=1 shotgun


  • add Stripe integration
  • add template-able email integration for purchase receipts + recover
  • add re-usable UI for purchasing, downloading, recover
  • upgrade to Tilt 2.0
  • remove bundler/setup call


Copyright Hugh Bien - Released under BSD License, see for more info.