Drippings
Drippings is a gem used to quickly create drip campaigns within rails apps without boilerplate de-duping logic
Usage
To define a drip, create a subclass of Drippings::ProcessJob
which implements process
. For example:
class LeadFollowupJob < Drippings::ProcessJob
# @param lead [Lead] the lead to email
def process(lead)
MessageSenderService.send(body: 'Hello, buy my product!', lead: lead)
end
end
ProcessJob
subclasses can also accept any ad hoc arguments you may need:
class LeadFollowupJob < Drippings::ProcessJob
# @param lead [Lead] the lead to email
def process(lead, phone:, transactional:)
MessageSenderService.send(
body: 'Hello, buy my product!',
lead: lead,
phone: phone,
transactional: transactional
)
end
end
To define the schedule on which you want your drips to process, register a drip by defining a
drip name, process job subclass, scope, and any additional arguments you want to pass via options
:
# config/initializers/drippings.rb
Drippings.configure do |config|
config.register(
"Lead::Followup",
LeadFollowupJob,
-> { Lead.active },
options: {
phone: '555-555-5555',
transactional: true,
}
)
end
You can also define a time to send your messages by defining a
wait_until
(formatted as a hash of time units) and a time_zone
, which
can either be a proc do determine a timezone per resource, or a string to define
a timezone for all resources:
Drippings.configure do |config|
config.register(
"Lead::Followup",
LeadFollowupJob,
-> { Lead.active },
wait_until: { hour: 16 }, # 4PM
time_zone: ->(lead) { lead.time_zone },
options: {
phone: '555-555-5555',
transactional: true,
}
)
end
Finally, add the Drippings::Kickoff
job to your recurring job scheduler, such as sidekiq-scheduler
# sidekiq.yml
drippings_kickoff_job:
cron: '*/15 * * * * UTC'
class: Drippings::KickoffJob
enabled: false
Installation
Add this line to your application's Gemfile:
gem 'drippings'
And then execute:
$ bundle
Or install it yourself as:
$ gem install drippings
License
The gem is available as open source under the terms of the MIT License.