When Redmine customization is worth outsourcing
Most Redmine teams can handle small configuration changes themselves, but custom code that changes how issues behave is usually better handed to a partner once the work goes beyond what the admin screens can express. A team whose trackers, workflows or reports no longer match how it works should first decide whether the gap can be closed with configuration alone. If it cannot, the gap is typically a development task that needs a planned, tested and maintained plugin or theme, and that is where outside help tends to pay off. The usual triggers are specific. A new business process may need a tracker with its own statuses and transitions, which the workflow editor under Administration can model only up to a point. An integration with another system may need custom fields that feed data back and forth, and those fields must be visible to the right roles in the right projects. A UI change, such as a different issue form layout or a dashboard for a specific group, often means overriding views or adding a theme. Finally, a requirement with no existing plugin fit, such as a custom approval step or a specialized report, needs new code.
Customization is also the part most likely to break at upgrade time. The upgrade guide asks you to copy third-party plugins to the new installation and then run database migrations for both the core application and the plugins, so every custom plugin is a dependency that must be checked against the target release. Redmine 7.0 runs on Rails 8.1 and supports Ruby 3.2, 3.3, 3.4 and 4.0, so a plugin written against an older Rails or Ruby version may fail before any feature is tested. Overridden views and patched core files are even more fragile, because they can change silently when core templates change. Before you decide, inventory every customization you already run. List each custom field, tracker, workflow, plugin, theme and view override, note who wrote it and whether its source is version controlled, and record which Redmine line it was tested on. Confirm which Ruby and database versions your environment uses, because these determine which Redmine releases you can move to without rebuilding the stack. Ask whether each requirement could be met by an existing plugin, and check that plugin's compatibility statement against the release you plan to run.
When you request a quote, ask the partner to separate the work into design, build, testing against your data, deployment and a documented upgrade path for each custom component. Ask how they will test customizations against the 7.0 line and the Ruby and Rails versions it supports, and whether they will keep a regression set of issues and workflows for later upgrades. Also ask who will own the code afterward and whether your team will receive the source, documentation and admin instructions. Those answers show whether the work will remain maintainable, which matters more for a customization than the initial build cost.
What Redmine customization work includes
Redmine customization splits into configuration that lives inside the application and code that lives beside it. Each work stream below ends with a named deliverable, and each is scoped in writing before work starts so the client knows what changes, what is handed over, and what will need attention at the next Redmine upgrade.
Tracker and custom field design
Trackers, custom fields and their project assignments define what a Redmine issue records. This work decides which fields are required, which are visible to which roles, and which values are validated, so reporting stays consistent across projects. The client receives a configuration record listing every tracker, field, format, default and project mapping, so an administrator can rebuild the setup later. Confirm who owns field naming before design starts, because renaming fields after data entry affects reports and imports.
Workflow and role configuration
Workflows control which status transitions each role may perform on each tracker, and roles control project permissions. Redmine's role-based access control is flexible, which also makes it easy to grant more access than intended. The work maps approval steps to statuses, reviews permissions against the people who will use them, and documents the result. The client receives a role and workflow matrix that shows, for each tracker and role, the allowed transitions and permissions. Ask for the matrix to be checked with the business owners before it is applied.
Theme and layout changes
Themes and layout changes alter how Redmine looks and where content appears, such as colors, logos, menus and project overview pages. Changes are usually made through a theme or a small set of view overrides, which keeps them separate from core files. The client receives the theme package with source, a short note on which views were overridden, and instructions for installing it on a new release. Check that every overridden view is listed, because overrides are the most common reason a visual change breaks after an upgrade.
Custom plugin development
Custom plugins add behavior that configuration cannot express, such as a new issue hook, a custom list, an integration with an internal system, or a bespoke report. The work covers requirements, design against Redmine's plugin hooks and APIs, implementation and automated tests. The client receives a plugin repository with source, tests, a changelog and an install guide. Ask which Redmine versions the plugin declares support for and how the team will test against them.
Plugin maintenance and upgrade testing
Plugins, including those written for this engagement, must be checked each time Redmine, Ruby or Rails changes. This work runs the plugin test suite and a staging upgrade against the target Redmine release, then records compatibility results and fixes breakages. The client receives an upgrade test report that lists each plugin, the Redmine version tested, the outcome and any code changes. Confirm which third-party plugins are in scope, since their maintainers' release schedules are outside DeployOpen's control.
Documentation and handover
Customizations are only maintainable if the next administrator understands them. Documentation covers the configuration record, the plugin install and upgrade steps, the known limits of each change, and the owner for each item. The client receives an administrator guide and a handover session recording who can change what. Ask for the guide to be kept in the client's own repository so it is updated alongside the configuration it describes.
What makes Redmine customization cost more or less
This table lists the factors that move the effort of a Redmine customization project up or down, why each one matters, and what the client can do to keep it contained. Read it before requesting a quote, because most of the cost comes from how many custom parts are built and how deeply they depend on Redmine internals. The main takeaway is that configuration and reuse of existing fields are the cheapest levers, while custom code that touches core behavior and must survive every upgrade is the most expensive.
| Driver | Why it moves effort | How to keep it down |
|---|---|---|
| Number of trackers and custom fields | Each tracker and custom field adds forms, validation rules, list columns, filters and permissions that must be tested against every role. | Reuse an existing field or tracker where the meaning matches, and retire unused fields before scoping. |
| Workflow complexity across roles and statuses | Transitions multiply with each status and role combination, and conditional rules on fields add test cases for each path. | Limit transitions to real business steps and agree the role matrix in writing before build starts. |
| Needs met by configuration instead of code | Trackers, workflows, roles, queries and custom fields are set up in the administration screens, so no code is written or maintained. | Ask for a configuration-first review of each requirement and accept built-in options when they meet the need. |
| Number and depth of plugins | Each plugin needs its own testing and upgrade path, and plugins that patch core classes or views break more often when Redmine changes. | Limit plugin scope to one purpose, prefer hooks over overriding core code, and review existing third-party plugins first. |
| Integrations with other systems | Integrations need credentials, API calls, error handling, data mapping and monitoring, and each external system has its own release cycle. | Define the data that crosses the boundary, use the stable REST API resources, and confirm which system owns each record. |
| Number of environments | Changes must be deployed and verified in test, staging and production, and each environment needs its own database and plugin configuration. | Agree how many environments are in scope and whether staging uses a recent copy of production data. |
| Supported Redmine line targeted | Redmine 7.0.x receives new features, bug fixes and security updates, while 6.1.x receives only bug fixes and security updates. Targeting an older line means more compatibility work now and another upgrade later. | Target the 7.0.x line for new work and confirm the Ruby version and plugin compatibility before scoping. |
| Compliance or approval steps | Security reviews, change approvals, evidence of testing and sign-off by data owners add review cycles and documentation that the build itself does not need. | Name the approvers and evidence formats at scoping, and combine review sessions instead of holding one per change. |
| Upgrade and maintenance expectations | Customizations that override core behavior must be re-checked on every Redmine upgrade, so the ongoing effort grows with the amount of custom code. | Keep custom code small, document each change, and confirm which upgrade and support services are included in the quote. |
Configuration before code: trackers, workflows, roles and custom fields
Most Redmine customization is configuration, not code. An administrator can shape how work is recorded and moved through a project by using the built-in screens for trackers, custom fields, workflows and roles. This approach should be the first option for any request, because settings made in the administration area survive ordinary Redmine upgrades without a rebuild, while plugin code has to be reviewed and retested against each new release. Before a team asks for a plugin, it should confirm that the requirement cannot be met through these screens. Trackers are the starting point. A tracker defines a type of issue, such as defect, feature or support request, and it decides which custom fields appear on those issues. Custom fields can be attached to trackers, to projects, or to both, and each field can be set as required, visible to certain users, or editable only by certain roles. A custom field that is enabled for a tracker but not for a project will not appear in that project, so teams should check both sides of the link when a field seems to be missing. Workflows control which status changes are allowed. In Redmine, a workflow is defined for each combination of role and tracker, and it lists the transitions a user holding that role may make from one status to another on that tracker. Field permissions in the same screen decide which fields are read-only, editable or required at each stage. Roles also control visibility through the permissions set for each role, including which projects a user can see and which actions they can take. A reader should review the workflow matrix for every role and tracker in scope, since a gap there is the most common reason users report that they cannot close an issue. A simple decision approach helps keep requests in configuration. If the change uses existing trackers, statuses, fields and roles, it belongs in configuration. If it needs new data behavior, such as a calculation, an external lookup, a new screen, or a notification rule that the core cannot express, it may need a plugin. Ask the team to write the request as a rule, then test whether each rule can be expressed with the built-in settings or a configured existing plugin. Any request that needs a plugin should get a written note on who will maintain it after each upgrade. Whatever the approach, the client should record every configuration change, including the tracker names, custom field definitions, workflow matrix, role permissions and the project links. A simple change log with the date, the person, the reason and the exported setting is usually enough. Redmine stores these settings in its database, so a new installation built from the same record can be brought to the same state without relying on memory. Confirm with your Redmine version which settings can be exported, and keep the export with the backups for the database and uploaded files.
How a Redmine customization project runs from scope to handover
The sequence moves a customization from a written need to a tested, documented change in production that your team can maintain through future Redmine upgrades. Each phase closes with a named output, so you can see what is finished before the next phase starts.
Assess requirements and fit
DeployOpen reviews each requested change with your project managers and administrators and sorts it into two groups: needs that core Redmine can meet through configuration (custom fields, trackers, workflows, roles, notifications) and needs that require code (new plugin behavior, theme changes, integrations with other systems). Requests that a supported existing plugin already covers are flagged so you do not pay to rebuild them. The output is a written requirements list with each item tagged as configuration or code, and the phase closes when you have approved that list in writing.
Design fields, trackers, workflows and roles
Working from the approved list, DeployOpen designs the data model and access model: which custom fields each tracker carries, which status transitions each role may perform, which projects inherit which settings, and how permissions map to your existing groups. Where a directory such as LDAP supplies group membership, the design records which group drives which role. Each design decision is written down with the reason for it. The phase closes with a design document that your administrators review, because the choices made here are the ones that are hardest to unwind after users have created data.
Build in a test environment
DeployOpen builds the configuration and code in a non-production Redmine instance that matches your production stack as closely as possible, including the database engine, the Ruby version for the chosen Redmine line, and the plugins already in use. Code changes are kept in version control, and each plugin change is tested against the Redmine line you run in production. The phase closes when the build passes the test cases agreed in the design, and those results are recorded so they can be repeated during release.
Rehearse the upgrade on the target Redmine line
Before any change reaches production, DeployOpen runs a rehearsal on a copy of your production data. The rehearsal follows the official upgrade procedure: back up the database and uploaded files, copy configuration, uploads and third-party plugins to the new installation, run the database migrations for Redmine and for plugins, clear the cache and restart. Where your current install is older than the supported 7.0 line, this rehearsal also shows which plugins need changes to run on the target line. The output is a rehearsal log with timings and any failures, and the phase closes when a clean run has been completed on the target version.
Confirm behavior through user acceptance
Your named users, such as project managers, developers and reporting staff, test the changes against the scenarios in the design document. DeployOpen supports the sessions, records each defect, and fixes items inside the agreed scope. Items outside scope go into a separate change request so the acceptance result stays clear. The phase closes with a signed acceptance record listing the scenarios passed, the defects fixed and any items deferred by agreement.
Release to production
DeployOpen schedules the release with your operations team and runs the same upgrade procedure rehearsed earlier, against production. Before the change window, backups of the database and attachments are confirmed as restorable. After the release, the team checks login, issue creation, workflow transitions, email notifications and any integrations, then watches logs for errors during an agreed period. The output is a release record covering what changed, when it was applied and the verification results, and the phase closes when your team confirms the system is working as designed.
Hand over documentation and support notes
DeployOpen delivers the documentation your administrators need to operate the change: the design document, configuration records, plugin versions and source locations, the rehearsal and release logs, and step-by-step notes for future upgrades. A support note states which parts of the customization depend on specific plugin versions and which checks to run before the next Redmine upgrade. A handover session walks through these with your administrators. The phase closes when your team has accepted the handover in writing, and any ongoing support, upgrade or testing is then covered by a separate agreement.
Building Redmine plugins that survive upgrades
The most important property of a Redmine plugin is that it keeps working after the core moves forward. A plugin survives upgrades when it uses the extension points Redmine exposes and avoids changing core code. Redmine plugins live in the plugins directory, each with its own init.rb that registers the plugin with the application, declares its version and requirements, and attaches behavior. Typical hooks include view hooks that inject content into existing pages, the menu and permission declarations that add navigation and roles, and callbacks on models that let the plugin react to saved issues or time entries. Each of these is a deliberate contract with the core. Plugins that instead patch core controllers, edit files under app or lib, or call private methods are relying on implementation details that Redmine is free to change, so they tend to break without warning when a new minor or major line arrives.
The upgrade path makes this risk concrete. The Redmine upgrade guide has administrators back up the database and uploaded files, copy configuration, uploads and third-party plugins into the new installation, then run the database migrations and the plugin migration task before clearing the cache and restarting. Copying a plugin is not the same as confirming it works. Each plugin must be exercised against each target Redmine release, and the Ruby and Rails versions that release requires. For Redmine 7.0, which runs on Rails 8.1, the supported Ruby versions are 3.2, 3.3, 3.4 and 4.0, and JRuby is not supported. Confirm the exact Ruby build your installation uses before you plan a test matrix, because a plugin that works on one Ruby version may fail on another if it depends on a gem with native extensions.
Version testing is where most upgrade failures are caught. Build a staging copy from a recent production backup, install the candidate Redmine release and each plugin at the version you intend to run, run the plugin migration task, and then test the workflows your users depend on: creating and editing issues with custom fields, running reports, triggering plugin hooks and reviewing permission behavior for each role. Automated tests in the plugin's test directory help, but they rarely cover the views and permissions of a real installation, so include manual checks for them. Record which Redmine, Rails and Ruby versions each plugin release was tested against. Ask any plugin author, internal or external, to pin dependencies and state compatibility in the plugin's README or changelog, and treat an unpinned gem or an undocumented version range as a risk to be planned for rather than assumed away.
Ownership after handover decides whether the plugin will still work two upgrades from now. Settle, in writing, who maintains the source repository, who holds the release process, who runs compatibility testing for each new Redmine line, and who fixes a breakage found in production. A plugin built for one organization is usually owned by that organization's platform team after handover, which means the team needs the source, the test suite, the staging procedure and the compatibility record, not only a deployed copy. Confirm whether the plugin carries a license that permits your internal changes, and whether any third-party code it bundles needs to be tracked. If the original builder will not maintain it, schedule the first upgrade test before the next Redmine release is announced, so the team learns the plugin's failure modes while the old version still runs.
Practical decisions follow from these points. Before building, list every core behavior the customization needs and check whether an extension point already provides it. Where none exists, weigh a small, isolated override against a feature request to the upstream project or a different design, and document the trade-off. Keep the plugin's version constraints visible, record the Redmine line it was tested against, and make the upgrade test a standing step in your change process rather than a one-time event. Scope the upgrade work and any retainer for later Redmine releases in the written scope, so the cost of keeping plugins compatible is visible before the first upgrade.
Which Redmine customization tasks teams keep in-house and which they outsource
This table compares the main customization tasks for Redmine by the skills each one needs and who usually holds them. Read each row to see whether your team already has that skill, and treat the Ruby and Rails rows as the deciding factor. The main takeaway is that the choice depends less on the task than on whether Ruby and Rails maintainers will still be on your team after handover.
| Task | Skills needed | Usually held by |
|---|---|---|
| Requirements gathering and workflow design | Business process mapping, knowledge of Redmine roles, trackers and workflow states | In-house, with a partner review of the design before build |
| Field and tracker administration | Redmine administration, custom field types, tracker and workflow configuration, role permissions | In-house, once the design is agreed |
| Ruby on Rails plugin development | Ruby, Rails, Redmine plugin API, hooks and view patches, database migrations | Outsourced unless the team already has Rails depth |
| Automated test writing | Ruby test tooling used by Redmine, fixtures, testing plugin behavior against core changes | Shared; the partner writes the first suite and the in-house team extends it |
| UI and theme work | CSS, HTML templates, Redmine view and layout structure, accessibility checks | Either, depending on whether the team has front-end skills |
| Upgrade rehearsal against new Redmine lines | Test environment setup, database migrations, plugin compatibility checks, Ruby and Rails version changes | Partner-led for the first rehearsal, then in-house if the team can repeat it |
| Ongoing plugin maintenance | Tracking upstream Redmine changes, fixing plugins after each release, reviewing plugin code for security issues | In-house if Rails maintainers stay; otherwise a retainer with a partner |
Redmine customization risks after an upgrade and how to prevent them
Custom fields, workflows and plugins are where most Redmine upgrades go wrong, because they sit outside the core code that the upgrade tests. The cards below cover five failure modes and the controls that catch each one before users see it.
Plugins break on a new line
Redmine plugins depend on core APIs, Rails versions and Ruby versions that change between release lines. A plugin that works on one line can fail to load, raise errors on screens it extends or stop sending email after a move. Redmine 6.0.x now receives only important security updates and 5.1.x and older are unsupported, so each delayed upgrade makes the next one larger. Prevention: rehearse the upgrade on a staging copy and run a compatibility test suite covering every installed plugin before cutover.
Silent workflow and field drift
Changes to trackers, statuses, roles or custom field permissions can let users make transitions that the process forbids, or hide required fields, without any error being raised. The problem often appears months later in reports and audits rather than during testing. Prevention: export the workflow and custom field configuration before every change, keep it in version control, and compare the export after the upgrade against a list of expected transitions for each role.
Plugins with no current owner
A plugin written by someone who has since left the organization may have no source of fixes, no record of its configuration and no one who knows what it changes in the database. When an upgrade breaks it, the team must either repair it blind or remove a feature users depend on. Prevention: assign a named owner to each plugin in a written register that lists its version, its purpose, the data it stores and the upgrade steps it needs.
Plugins from unreviewed sources
Plugins installed from unknown repositories, archives or forum posts run with the same privileges as Redmine itself and can read issues, attachments and user data. They may also contain code that changes permissions or sends data to external hosts. Prevention: review the source code, confirm the license is compatible with your use, pin the version you reviewed, and record where it came from before it is installed on any server that holds production data.
Migrations run without rehearsal
Redmine runs database migrations and plugin migrations as part of an upgrade, and some of them cannot be reversed without restoring from backup. Running them for the first time in production turns a schema problem into an outage with uncertain data. Prevention: restore a recent production backup into a staging environment, run the full upgrade procedure there, time it, check the migrated data against sample records, and confirm that the backup restore itself works before the production window.
How Redmine customization changes by starting point
A stock Redmine install with light configuration needs is the simplest starting point. Most of the work is configuration rather than code: custom fields, trackers, workflows, roles and project templates are defined through the administration screens, and the core product carries the load. Plugin development is usually limited or absent, which keeps the upgrade path short. The main question is whether the requirements can be met with configuration alone, and that answer should be documented before any code is written.
- Scope: Mostly configuration of custom fields, trackers, workflows and roles, with a small set of theme or template changes if branding is needed.
- Sequencing: Define the data model and role matrix first, then build workflows, then train administrators on the configuration they own.
- Testing: Walk through each tracker and workflow transition with a test account for every role, and confirm that custom field visibility matches the role matrix.
- Upgrade impact: Few moving parts, so the upgrade procedure in the Redmine upgrade guide mainly touches configuration and uploads.
- Ask your provider: Which requirements are met by configuration, and which would require a plugin that must be maintained.
Before committing, confirm with your team that every requirement on the list can be expressed through the administration screens, because any gap is the first sign that a plugin will be needed.
An install already carrying several third-party plugins starts with an inventory problem. Each plugin has its own compatibility with the Redmine version, its own database migrations and its own maintainer, and some may no longer be maintained. New customization has to be sequenced around that existing set, and any change to core Redmine can affect how a plugin behaves. The work therefore begins with analysis, not with new features.
- Scope: Inventory every installed plugin, its version, its source and its compatibility with the target Redmine line, then decide which to keep, replace or remove.
- Sequencing: Resolve plugin conflicts and compatibility gaps before adding new custom fields or workflows that depend on them.
- Testing: Run regression checks on issue forms, workflows and any hooks that plugins extend, since two plugins can touch the same screen.
- Upgrade impact: The upgrade guide asks for third-party plugins to be copied and migrated with redmine:plugins:migrate, so each plugin must be checked against the new version before that step.
- Ask your provider: Which plugins are unmaintained, which overlap in function and what the test plan covers for plugin interactions.
Keep the inventory current, because plugin upgrades are often the hidden cost in a heavily extended installation.
An older installation on an unsupported line must move forward before any new work begins. According to the Redmine download page, 5.1.x and older are unsupported, so security fixes no longer come for those lines. The customization plan has to start with the upgrade path, and any custom code written for the old version may need rework against the newer Rails and Ruby requirements. New features built on an old base would only add to the upgrade burden later.
- Scope: Assess the current version, the Ruby and database versions in use, and every custom plugin's compatibility before setting the target line, which the download page lists as 7.0.x for full support.
- Sequencing: Upgrade the platform first, then rebuild or port custom plugins, then add new customization on the supported base.
- Testing: Restore a copy of production data into a staging environment and run the upgrade there before any change reaches users, checking custom fields, workflows and attachments.
- Runtime changes: Redmine 7.0 runs on Rails 8.1 and supports Ruby 3.2, 3.3, 3.4 and 4.0, so confirm the runtime on the target server and any plugin dependencies.
- Ask your provider: Which custom code is incompatible with the target line, and how the rollback plan works if the upgrade fails.
Confirm the current version and the full list of custom code before agreeing any new scope, because that inventory determines how much of the work is upgrade and how much is customization.
An air-gapped or restricted network changes how every component reaches the server. Plugins, gems and any reference material must be packaged in advance, reviewed offline and transferred through an approved process. Development tools that depend on public package sources are not available by default, so the build environment has to be reproducible inside the boundary. The schedule depends on the review and transfer controls the organization already runs, so those controls should be mapped early.
- Scope: Identify every plugin, dependency and runtime package the customization needs, then build an offline bundle with a documented source and version for each.
- Sequencing: Agree the review and transfer process with the security team before any code is written, since a plugin that cannot be reviewed cannot be installed.
- Testing: Test installation from the offline bundle in a staging environment that mirrors the restricted network, including the database and the optional components, such as ImageMagick or Pandoc, that must also be packaged.
- Review: Record the origin, version and checksum of each package so reviewers can verify the bundle matches what was approved.
- Ask your provider: How the offline build is reproduced, how updates are reviewed and how a security patch reaches the restricted network.
Confirm the review and transfer process before scoping, because it determines how long each plugin change takes to reach production.
What your team must provide before Redmine customization starts
Customization work on Redmine moves at the pace of the inputs your team delivers. Before any custom field, tracker, workflow or plugin is designed, your side needs to provide eight items, and each one has a named owner. Missing items do not usually stop the work outright. They push design decisions into later phases, force rework once real data shows up, and extend the timeline in ways that are hard to predict at the start. The sections below describe what each item is, who should own it on your side, and what goes wrong when it is absent.
The first two items protect the work. The first is a staging or test Redmine that mirrors production: same Redmine line, same database engine and version, same installed plugins and a copy of production data, sanitized where personal data requires it. Owner: the platform or IT operations lead. Without it, customizations are tested against an empty or unlike system, and plugin conflicts appear only after go-live. The second is a database and file backup to restore from, covering both the database and the uploaded attachments. Owner: the backup or infrastructure team. Redmine's own upgrade guide treats these two backups as the starting point of any change, so ask your team to confirm that a restore has been tested, not just that backups run.
The next three items control access and scope. Administrator access must be granted to the people doing the work, under an agreed change process that states who approves a change to production, how it is scheduled and how it is rolled back. Owner: the Redmine application owner, with the change manager signing off. Each tracker and workflow also needs a named business owner who decides field meaning, status transitions and role permissions. Owner: the department lead for each project area. Requirements should be written as process steps with the roles involved, for example who creates an issue, who triages it, who may move it to closed. Owner: the business analyst or project lead. Vague requirements such as "better approval handling" are the most common reason design cycles repeat.
The remaining three items define what is being changed. Provide a list of current plugins with versions and sources, including whether each one was downloaded from the Redmine plugin directory, a vendor or an internal team. Owner: the Redmine administrator. This list determines which plugins must be reviewed for compatibility with the target line and which ones must be replaced. Provide a Git or equivalent repository for plugin code, with branch rules and access for the development team. Owner: the source control administrator. Without it, code moves through email or shared folders and history is lost. Finally, decide which Redmine line the work targets. The current supported line is 7.0.x, which receives new features, fixes and security updates, while 6.1.x and 6.0.x receive narrower support. Owner: the CIO or application owner. Deciding this early determines Ruby and Rails versions and which plugin APIs can be relied on. Confirm the exact versions and support windows against the Redmine download page when you make this decision.
Questions buyers ask about Redmine customization and plugin work
Can our own team handle Redmine configuration without a partner?
Often yes, for routine configuration. Custom fields, trackers, roles, workflows, email settings and project modules are set through the administration interface, so an administrator who has read the Redmine documentation can make these changes. The work becomes harder when the team needs changes to code, themes, or behavior that the interface does not expose. Check three things before deciding: whether the admin staff have time to test changes on a staging copy, whether they can review changes to plugins, and who will handle the next upgrade. A written scope from a partner makes the split between your team and an outside team explicit, so you can see which tasks stay in-house.
What drives the cost of Redmine customization and plugin work?
The main driver is how much new logic must be written and tested. Configuration of existing features costs less than a custom plugin, because the plugin needs design, development, test coverage, and compatibility checks for each Redmine release. Other cost drivers include the number of trackers and workflows, integrations with other systems, the amount of data migration, the number of environments, and how much documentation and training the handover requires. Redmine itself has no license fee, so the quote covers implementation labor and any ongoing support or upgrade retainer. Ask for a quote that separates one-time build work from recurring upkeep, lists each deliverable, and names the Redmine version it targets.
How long does a Redmine plugin or customization project take?
Duration depends on the scope written into the statement of work. The largest factors are the number of requirements, how many workflows and roles must change, whether an external system needs an integration, how many approval rounds the business requires, and how quickly your team can answer questions and test builds. Plugins that touch core behavior, such as permissions or issue lifecycle, usually take longer to verify than changes that only add fields. Ask the partner to tie each milestone to a deliverable and a test you can run, and to state which tasks depend on your input. Work that is fixed in writing can be planned against a schedule, and changes to scope should be priced and dated before they start.
Can we avoid building a custom Redmine plugin?
Often you can, if the need fits what Redmine already provides. Start by testing whether custom fields, trackers, workflows, roles, and project templates cover the requirement. Redmine's core features include flexible role-based access control, custom fields, email-based issue creation, and multiple LDAP authentication sources. Check whether a plugin already published for the Redmine version you run meets the need, and review its maintenance history before you adopt it. If a single sign-on requirement arises, note that SAML and OpenID Connect are not part of core Redmine. Such work may rely on a plugin or an authenticating reverse proxy, so confirm that option with your architecture team. A custom plugin is justified when no existing option fits and the business value outweighs the upkeep.
Who owns a custom Redmine plugin after handover?
Ownership is set by the contract and the license on the code, so confirm both before work begins. Redmine is licensed under the GNU General Public License v2, and a plugin that is distributed or linked to Redmine has to be handled under the terms that apply to that code. Your agreement should state who holds the source code, who can modify it, where the repository lives, and who keeps the documentation and test suite current. Ask for the repository to be delivered in your own accounts with build instructions, installation steps, and a list of Redmine versions the plugin has been tested against. Clear ownership terms make later maintenance and vendor changes far simpler.
What happens to our plugins at the next Redmine upgrade?
Plugins are the most common source of upgrade delays, because each plugin must be checked against the new Redmine and Rails versions. The Redmine upgrade procedure has you back up the database and uploaded files, copy configuration, uploads, and third-party plugins to the new installation, then run db:migrate and redmine:plugins:migrate before clearing the cache and restarting. Redmine 7.0 runs on Rails 8.1 and supports Ruby 3.2, 3.3, 3.4 and 4.0, so any plugin that depends on older Ruby or Rails behavior needs review. The current stable releases are 7.0.2 and 6.1.5, both dated October 1, 2026, and 6.0.11, dated August 26, 2026. Confirm which line you run, because 7.0.x receives full support while 5.1.x and older are unsupported.
Does Redmine customization need our developers involved?
Your developers are not always required, but their involvement usually lowers risk. Business analysts or administrators can define requirements, approve workflows, and test changes. Engineers are needed to review code, confirm how a plugin interacts with your authentication, backups, and reverse proxy, and to set up the deployment pipeline. If your team has no Ruby or Rails experience, plan for an engineer to receive the handover and maintain the code after the project ends. Ask the partner to name the skills required on your side, how many hours of review they expect, and who will answer questions during testing. Clear responsibilities on both sides keep the work inside the written scope.
How DeployOpen works on this
DeployOpen scopes Redmine customization and plugin development as a written, fixed-scope engagement before any code is written. Each customization is built against the Redmine release line your organization runs, tested in a staging copy of your environment, and delivered with documentation your administrators can maintain.
How we scope
- Inventory current trackers, custom fields, workflows, roles and any installed plugins before defining changes
- Record the target Redmine line, for example whether the work targets the fully supported 7.0.x branch
- Agree in writing which custom fields, workflows, themes or plugins are in and out of scope
- Confirm the database and hosting setup, since customizations must run on your chosen PostgreSQL, MySQL or SQL Server platform
How we build
- Keep customizations in version-controlled code so every change can be reviewed and rolled back
- Isolate plugin logic from core Redmine code so upgrades do not overwrite local changes
- Test workflow transitions, role permissions and custom field behavior in a staging copy before production
- Check plugin behavior against the Ruby and Rails versions required by the target Redmine release
How we hand over
- Deliver written documentation covering configuration, plugin structure, installation steps and known limitations
- Provide an upgrade note listing each change that must be re-tested when Redmine moves to a new release
- Walk administrators through custom field, tracker and workflow settings so they can maintain them without us
- Hand over source code, configuration files and test cases to your repository under agreed terms
How we support
- Ongoing support, upgrades and plugin maintenance are available as a retainer, scoped separately from the build
- Re-test plugins against each Redmine upgrade, including the database migration and plugin migration steps
- Confirm with your team which support tier and response expectations apply before the engagement starts
- Ask for the support terms in writing so cost and responsibilities for future upgrades are clear

