Current version: 3.3.4. See the changelog for release details.
- Website: https://github.com/likehopper/redmine_sla
- Code repository: git@github.com:likehopper/redmine_sla.git
- Redmine plugins directory: https://www.redmine.org/plugins/redmine_sla
redmine_sla provides advanced Service Level Agreement management for Redmine.
It enables precise SLA computation based on:
- Project trackers
- Working calendars (HO / HNO)
- SLA levels and priorities
- Response and resolution terms
- Database-native time-based procedures
SLA compliance is calculated directly at the database level using PostgreSQL or MySQL/MariaDB stored procedures, ensuring:
- Deterministic computation
- Accurate working-hours handling
- High performance on large datasets
Many SLA implementations rely exclusively on Ruby time computations.
This plugin delegates SLA calculation to database stored procedures, allowing:
- Accurate handling of working schedules
- Holiday-aware deadlines
- Efficient computation on large issue volumes
- Predictable and reproducible results
The engine is designed for production environments.
SLA
├── SLA Level
│ └── SLA Terms (Response / Resolution)
├── SLA Calendar
│ ├── Weekly Schedule
│ └── Holidays
└── SLA Status Mapping
An SLA is the top-level contract (e.g. "Gold Support", "Standard Support"). It is assigned to one or more project / tracker pairs, so the same SLA definition can be reused across several projects.
An SLA is broken down into one or more SLA Levels. Each level pairs the SLA with a single SLA Calendar and groups the actual SLA Terms: for every combination of SLA Type (e.g. Response, Resolution) and priority — either a native Redmine issue priority or a custom field value — a term defines the committed duration, in minutes.
An SLA Calendar describes when the clock actually runs:
- Weekly Schedule: working hours per day of week (HO / HNO), used to suspend or resume the countdown outside business hours.
- Holidays: non-working days shared across calendars. The
matchflag decides whether time is simply suspended on that day, or whether an SLA already running is allowed to continue through it.
SLA Status Mapping links each SLA Type to the Redmine issue statuses it should track — for instance "Response" usually maps to the "New" status only, while "Resolution" maps to every status prior to closure ("New", "Assigned", "Feedback", ...). This mapping tells the database procedures which time ranges to accumulate for each type of commitment, independently of any particular SLA, and is what the diagram's "SLA Status Mapping" branch and "SLA Calendar" branch stand for: both are reusable building blocks referenced by SLA Levels/Types rather than data private to a single SLA.
At runtime, the calculation engine combines Terms + Calendar + Status Mapping to compute compliance for every issue in scope — see SLA Compute Explanation for the underlying algorithm.
- PostgreSQL PL/pgSQL or MySQL/MariaDB SLA computation
- Working calendar awareness (HO / HNO)
- Response & resolution deadlines
- SLA compliance percentage
- Configurable update step
- Configurable calculation time zone
Fully manageable through UI and REST API:
- SLAs
- SLA Types
- SLA Statuses
- SLA Holidays (with public holiday import)
- SLA Calendars
- Weekly schedules
- Calendar-specific holidays
- SLA Levels
- SLA Terms
- SLA assignment per tracker
- Role-based permissions
- SLA visibility control
- SLA columns in issue list
- SLA column and filter in the project lists (user and administration)
- SLA filtering
- SLA summary in issue view
- Responsive display
- SLA filtering
- SLA columns in time log list
- Manual SLA update task
- Cron-based update support
- CSV-based fixture builder
- English
- French
- Graphical schedule editor
- Tabular SLA term editor
- Improved calendar visualization
- Per-project time zone
- Alert thresholds & notifications
- SLA import (CSV export already available)
- SLA summary in issue reports
- Cache invalidation strategy
- Full functional test coverage
| Name | requirement |
|---|---|
Redmine |
>= 5.0 |
Ruby |
>= 2.7 |
Rails |
>= 6.1 |
Database |
PostgreSQL >= 11, MySQL >= 8.0 or MariaDB >= 10.2 |
Version 3.3.3 has been checked on Redmine 5.1.13, 6.1.4 and 7.0.1, with unit, functional, API and Chromium tests on PostgreSQL, MariaDB and strict MySQL. See the compatibility matrix for exact runtime versions and results.
This plugin relies on database-native views and stored procedures, and
therefore requires the SQL schema format. In config/application.rb:
config.active_record.schema_format = :sqlThis is mandatory for every supported database.
SQLite is not supported.
Ensure PostgreSQL datestyle is set to ISO:
ALTER DATABASE "redmine_db" SET datestyle="ISO,MDY";Recommended configuration:
config.active_record.default_timezone = :localPrefer global timezone configuration set to:
Etc/UTC
Before migrating the plugin:
-
Load the server time-zone tables, which are required by SLA timestamp conversions:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql -
If binary logging is enabled, allow the migration to create stored functions:
SET GLOBAL log_bin_trust_function_creators = 1;
The setting can be made persistent with
log_bin_trust_function_creators = 1under[mysqld].
Use Etc/UTC as the server-wide time zone where possible.
- Copy
redmine_slainto Redmine'spluginsdirectory\ - Run:
bundle install- Migrate:
rake redmine:plugins:migrate NAME=redmine_sla- Restart application server
Plugin is ready to use.
Version 3.3.4 appends the year to imported holiday names and offers English
or the country's local names (French for France). Local names are selected by
default and require access to date.nager.at through the legacy Nager.Date v3
API. Existing holidays keep their names. Update the plugin files and restart
Redmine; no new migration relative to 3.3.3. See Public holiday import.
Version 3.3.3 shows the SLA block of the issue page only for trackers with an SLA in the project. Update the plugin files and restart Redmine; there is no migration relative to 3.3.2.
Version 3.3.2 only extends the test fixtures. Update the plugin files; there is no migration and no functional change relative to 3.3.1.
Version 3.3.1 documents the SLA roles and permissions in the plugin settings. Update the plugin files; there is no migration and no functional change relative to 3.3.0.
Version 3.3.0 imports public holidays from Nager.Date: from the SLA holiday
list, administrators choose a year, a country and the name language, preview the holidays and
import the selected dates. An optional default country can be set in the
plugin settings. See Public holiday import. Update the
plugin files and restart Redmine; this release introduces no new migration
relative to 3.2.0. The Redmine server needs outbound HTTPS access to
nagerholidays.com (and date.nager.at for local names) to use the import.
Version 3.2.0 adds an SLA column and filter to the project lists
(Projects in list mode and Administration > Projects) and an SLA icon in
the project board view. Administrators see every project; other users only
see the SLAs of projects where they have View SLA or Manage SLA. See
Projects with SLA. Update the plugin files and restart
Redmine; this release introduces no new migration relative to 3.1.5.
Version 3.1.5 invalidates the SLA caches of levels using an issue custom field when that field or one of its enumeration values changes. Update the plugin files and restart Redmine; this release introduces no new migration relative to 3.1.4.
Version 3.1.4 invalidates the SLA caches of competing levels in the same SLA when calendars, schedules or holiday rules change, including level creation and changes of SLA or calendar assignment. Calendar-holiday links are removed with their calendar or holiday. Update the plugin files and restart Redmine; this release introduces no new migration relative to 3.1.3. Calendar name/description and holiday name edits preserve caches. Calendar and holiday destruction invalidate once, covering their dependent records.
Version 3.1.3 keeps counting SLA spent time once a closed issue is reopened. Redmine keeps the last closing date on reopening, and the calculation stopped there; it now uses it only while the issue is closed. Back up the database, update the plugin files, then run:
bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=productionRestart Redmine after migration (202111112021024). The spent-time cache of
issues already reopened is purged and recalculated on demand, or at once with
update_sla.
Version 3.1.2 removes SQL functions nothing calls anymore:
sla_get_level_overlap and, on PostgreSQL, sla_explain_level and
sla_explain_spent. The "Explain" view uses the Ruby explanation service on
every database. Back up the database, update the plugin files, then run:
bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=productionRestart Redmine after migration (202111112021023).
Version 3.1.1 stops SLA calculation on projects whose SLA module is
disabled: their SLA cache is purged and no longer rebuilt, while their
project-tracker configuration is kept for a later re-enabling. The
update_sla task now processes all projects, applies its scope option and
gains a projects=[all,with_sla,without_sla] option.
Back up the database, update the plugin files, then run:
bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=productionMigration 202111112021021 makes the sla_get_level SQL function check the
project's SLA module. Restart Redmine after migration, then run update_sla
once to purge the cache left on projects without the SLA module.
Version 3.1.0 adds optional wiki descriptions to SLAs, SLA types, calendars and levels, and fixes HTTP 500 errors in list block columns. Descriptions appear on detail pages and as plain-text name tooltips (up to 250 characters). The API reads and writes the original wiki text.
Back up the database, update the plugin files, then run:
bundle exec rake redmine:plugins:migrate NAME=redmine_sla RAILS_ENV=productionRestart Redmine after migration. Existing records retain their data and receive a nullable description. Rolling back the migration deletes description data; restore the previous plugin files as part of a downgrade.
Update the plugin files and restart Redmine. This release introduces no new schema migration relative to 3.0.5. It fixes stale issue SLA values and native query filters, sorting and grouping, including time entries without an issue. See the validation results.
Update the plugin files and restart Redmine. This release introduces no new schema migration relative to 3.0.4; when upgrading from an older version, run the plugin migration command from the installation instructions as usual.
This release enforces project-scoped manage_sla permission when creating or
moving project-tracker assignments and fixes compatibility with Redmine 5.1
and 7.0. No new permission is introduced. See the
compatibility matrix for the exact
versions tested. Custom Ruby integrations that relied on implicit model joins
should follow the query scope guide.
rake redmine:plugins:migrate NAME=redmine_sla VERSION=0Then remove the plugin folder:
rm -r redmine_slaRestart application server.
- Contributing
- Code of Conduct
- Security policy
- Testing
- Query scopes and Ruby integrations
- Conceptual Data Model
- Step-by-step use case
- SLA Compute Explanation
- Plugin settings
- Projects with SLA
- Public holiday import
- API Rest for SLA
- Tasks
- Change log
- License
Icons created by Magnific on Flaticon. See the image credits.

