Ruby on Rails
Contents
PostHog makes it easy to get data about traffic and usage of your Ruby on Rails app. Integrating PostHog enables analytics, custom events capture, feature flags, and automatic exception tracking.
This guide walks you through integrating PostHog into your Rails app using the posthog-rails gem.
Beta: integration via LLM
Install PostHog for Rails in seconds with our wizard by running this prompt with LLM coding agents like Cursor and Bolt, or by running it in your terminal.
Or, to integrate manually, continue with the rest of this guide.
Features
- Automatic exception tracking – Captures unhandled and rescued exceptions
- ActiveJob instrumentation – Tracks background job exceptions
- User context – Automatically associates exceptions with the current user
- Smart filtering – Excludes common Rails exceptions (404s, etc.) by default
- Rails 7.0+ error reporter – Integrates with Rails' built-in error reporting
Installation
Add both gems to your Gemfile:
Then run:
Generate the initializer
Run the install generator to create the PostHog initializer:
This creates config/initializers/posthog.rb with sensible defaults and documentation.
Configuration
The generated initializer includes all available options:
You can find your project API key and instance address in your project settings.
Tip: Use
Rails.application.credentialsto avoid hardcoding API keys. First, add your keys and then reference them in your initializer:Terminalconfig/credentials.yml.encconfig/initializers/posthog.rb
Capturing events
Track custom events anywhere in your Rails app:
Error tracking
For full details on setting up error tracking with Rails, see our Rails error tracking installation guide.
Automatic exception tracking
When auto_capture_exceptions is enabled, exceptions are automatically captured:
Manual exception capture
You can also manually capture exceptions:
Background job exceptions
When auto_instrument_active_job is enabled, ActiveJob exceptions are automatically captured with job context:
Associating jobs with users
By default, PostHog extracts a distinct_id from job arguments by looking for a user_id key:
For more control, use the posthog_distinct_id class method:
Rails 7.0+ error reporter
PostHog integrates with Rails' built-in error reporting:
PostHog automatically extracts the user's distinct ID from user_id or distinct_id in the context hash.
User context
PostHog Rails automatically captures user information from your controllers. If your user method has a different name, configure it:
User ID extraction
By default, PostHog Rails auto-detects the user's distinct ID by trying these methods:
posthog_distinct_id– Define this on your User model for full controldistinct_id– Common analytics conventionid– Standard ActiveRecord primary key
You can configure a specific method:
Or define a method on your User model:
Excluded exceptions
The following exceptions are not reported by default (common 4xx errors):
AbstractController::ActionNotFoundActionController::BadRequestActionController::InvalidAuthenticityTokenActionController::RoutingErrorActionController::UnknownFormatActiveRecord::RecordNotFound
Add more with:
Feature flags
Use feature flags in your Rails app:
For local evaluation, ensure you've set personal_api_key:
See our Ruby SDK docs for details on local evaluation with Puma and Unicorn servers.
Testing
In your test environment, disable PostHog or use test mode:
Or in your specs:
Configuration reference
Core PostHog options
| Option | Type | Default | Description |
|---|---|---|---|
api_key | String | required | Your PostHog project API key |
host | String | https://us.i.posthog.com | PostHog instance URL |
personal_api_key | String | nil | For feature flag evaluation |
test_mode | Boolean | false | Don't send events (for testing) |
on_error | Proc | nil | Error callback |
Rails-specific options
| Option | Type | Default | Description |
|---|---|---|---|
auto_capture_exceptions | Boolean | false | Automatically capture exceptions |
report_rescued_exceptions | Boolean | false | Report exceptions Rails rescues |
auto_instrument_active_job | Boolean | false | Instrument ActiveJob |
capture_user_context | Boolean | true | Include user info |
current_user_method | Symbol | :current_user | Controller method for user |
user_id_method | Symbol | nil | Method to extract ID from user object |
excluded_exceptions | Array | [] | Additional exceptions to ignore |
Troubleshooting
Exceptions not being captured
Verify PostHog is initialized:
RubyCheck your excluded exceptions list
Verify middleware is installed:
Ruby
User context not working
- Verify
current_user_methodmatches your controller method - Check that the user object responds to
posthog_distinct_id,distinct_id, orid - If using a custom identifier, set
PostHog::Rails.config.user_id_method = :your_method
Feature flags not working
Ensure you've set personal_api_key in your configuration.
Next steps
For any technical questions for how to integrate specific PostHog features into Rails (such as analytics, feature flags, A/B testing, etc.), have a look at our Ruby SDK docs.