Persistent Records
Every notification is stored as a first-class model in your database with full lifecycle tracking.
Sincerely brings observability to Rails notifications. Persist, track, and query every email, SMS, and push notification your app sends.
Most Rails apps implement notifications as mailers, background jobs, or third-party integrations. This approach creates blind spots:
Everything you need to own and observe your notification infrastructure
Every notification is stored as a first-class model in your database with full lifecycle tracking.
Track notifications through states: draft → accepted → delivered → engaged with event-driven updates.
Capture delivery and engagement events from AWS SES or other providers via webhook handlers.
Pluggable delivery systems. Start with AWS SES, swap providers without changing your code.
Use ActiveRecord to analyze patterns, build dashboards, and understand your communication data.
Your notification data lives in your database, not locked away in a third-party service.
Sincerely includes a built-in interface to manage and monitor notifications directly inside your Rails application.
View notification analytics such as deliveries, bounces, spam reports, opens and clicks. Filter notifications by recipient, status, template, or date to quickly investigate issues.
Create and manage notification templates and send messages while keeping a clear record of everything that was delivered.
Sincerely feels like Rails. No complex integrations, just familiar patterns.
# Create and send a notification
notification = Notification.create!(
recipient: user,
subject: "Welcome to our platform",
body: render_template(:welcome_email)
)
notification.deliver!
# => :accepted
# Query notification history
Notification.where(recipient: user)
.delivered
.where("created_at > ?", 1.week.ago)
# Track engagement
notification.opened? # => true
notification.clicked? # => false
notification.bounced? # => false
# Event-driven state updates
notification.events
.where(event_type: "delivered")
.order(occurred_at: :desc)
The core beliefs that guide Sincerely's design
Teams should own their communication data, not rely on external dashboards.
They should be persisted, stateful, and queryable just like any other model.
Accepted does not mean delivered. Track the full lifecycle with real events.
Notification state changes only through delivery and engagement events.
Add Sincerely to your Rails app in minutes
gem 'sincerely'
bundle install
rails sincerely:install
rails db:migrate
# config/sincerely.yml
defaults: &defaults
delivery_methods:
email:
delivery_system: Sincerely::DeliverySystems::EmailAwsSes
options:
region: region
access_key_id: your_access_key_id
secret_access_key: your_secret_access_key
configuration_set_name: config_set
Open source, Rails-native, and built for teams that value data ownership.