Stripe SAAS Rails Engine
Ruby HTML CSS JavaScript
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
app
bin
config
lib
spec
.gitignore
.rspec
CHANGELOG.asc
Gemfile
MIT-LICENSE
README.asc
Rakefile
stripe_saas.gemspec

README.asc

StripeSaas

A Rails 4 Engine providing Stripe subscription management for SaaS applications. Based on the work of Andrew Culver in Koudoku (https://github.com/andrewculver/koudoku).

Status

CI Status Code Climate Test Coverage

Installation

Add gem dependency

Include the stripe_saas gem in your Gemfile and bundle (install):

gem 'stripe_saas'

Install subscriptions management on a model.

A rails generator is provided to install the StripeSaas models:

rails g stripe_saas:install user

Stripe Subscriptions

A model that mirrors a Stripe subscription (https://stripe.com/docs/api/ruby#subscriptions) is generated and a one-to-one relationship between it and one of your application’s models as the owner of the subscription.

In the example above the generated StripeSaas::Subscription 'belongs to' your application’s User:

class Subscription < ActiveRecord::Base
  include StripeSaas::Subscription

  belongs_to :user
end

and the User class will have one (has_one) subscription:

has_one :subscription

Stripe Plans

A model that mirrors a Stripe plan (https://stripe.com/docs/api/ruby#plans) is generated.

class Plan < ActiveRecord::Base
  has_many :subscriptions
  has_many :plan_features
  has_many :features, through: :plan_features

  default_scope { order(:display_order) }

  include StripeSaas::Plan
end

Plans have PlanFeatures which in turn are join table/model between Plan and Feature:

class Feature < ActiveRecord::Base
  has_many :plan_features
  has_many :plans, through: :plan_features

  default_scope { order(:display_order) }

  include StripeSaas::Feature
end

To create a Feature for example, you could use:

Feature.find_or_create_by(name: 'signals').update({
  description: "Inbound Signals",
  feature_type: :number,
  unit: "signals",
  display_order: 1
})

Where the feature type can be one of:

FEATURE_TYPES = {
  boolean: 'Boolean',
  interval: 'Interval (in seconds)',
  filesize: 'Filesize (in bytes)',
  number: 'Number',
  percentage: 'Percentage (%)'
}

To create a plan (in your seeds for example) with a set of features you could use something like:

developer_plan = Plan.find_or_create_by(stripe_id: 'developer')
developer_plan.update({
  name: 'Developer',
  price: 0.0,
  interval: 'month',
  interval_count: 1,
  statement_descriptor: 'Binnacle Developer Plan',
  trial_period_days: 30,
  display_order: 1
})

developer_plan.add_feature(:signals, 50000)

Any plan with a price of 0.0 is considered a free plan in StripeSaas which will not require the user to enter credit card information.

After running the installer you will have to migrate your database:

rake db:migrate

Configuration

As part of the installation procedure an initializer is generated under config/initializers/stripe_saas.rb:

StripeSaas.setup do |config|
  config.subscriptions_owned_by = :user
  # config.devise_scope = :user
  config.stripe_publishable_key = ENV['STRIPE_PUBLISHABLE_KEY']
  config.stripe_secret_key = ENV['STRIPE_SECRET_KEY']
  config.create_plans_in_stripe = false
end
  • subscriptions_owned_by: The symbol of the class that owns the subscription

  • devise_scope: If using Devise and the subscription is not owned by the devise class (user/customer). For example, if users have accounts, and accounts have subscriptions. Then config.subscriptions_owned_by = :account and config.devise_scope = :user

  • stripe_publishable_key: Your Stripe Publishable Key https://stripe.com/docs/tutorials/dashboard#api-keys

  • stripe_secret_key: Your Stripe Secret Key https://stripe.com/docs/tutorials/dashboard#api-keys

  • create_plans_in_stripe: Whether to autogenerate the local Plans in Stripe and keep then in synch