Backstage plugin development: when custom plugins justify a partner
Custom plugin work is usually the part of a Backstage project that teams hand to a partner, because it is where the built-in features stop and the organization's own systems, workflows and branding begin. A team that already has a working Backstage app typically starts this work when one of three things happens: a missing integration (an internal ticketing system, a cloud inventory or a compliance tool that no community plugin covers), a new team workflow that needs a custom page or card, or a homepage redesign that the default layout cannot express. The work spans several components, and each one carries different risk. Frontend plugins are React components registered in the app and exposed through extension points. Backend plugins run on the backend system, own their data through their own logical database, and expose routes that the frontend calls. Catalog processors and entity providers decide what enters the Software Catalog and how entities are validated. Scaffolder actions run inside Software Templates and can create repositories, pipelines or infrastructure, so they need the same review as any code that touches production systems. Theming and homepage work sit on top of the Backstage UI layer and must be checked against the upgrade path before they are built.
Decisions to make before scoping. Ask which components the custom work touches, whether each one needs a backend, and who will own it after handover. Confirm whether the plugin reads from the catalog through the existing catalog APIs or needs its own data store. Check how each plugin will handle sign-in and permissions, since a plugin that trusts the frontend alone will expose data that the catalog permission model is meant to restrict. Ask the partner to name the Backstage version they will target and the packages they will import, because imports from internal modules are the most common source of breakage at upgrade time. Request a written list of extension points, routes, permissions and external credentials per plugin. Those items drive most of the testing and most of the later maintenance, and they belong in the fixed-scope agreement.
Small plugins can be built in-house by a team with solid TypeScript and React skills, especially a single card, a catalog processor or one scaffolder action that reads from a well-documented API. The team still needs someone who understands the Backstage plugin model and who will read each upgrade release. Larger extension sets, such as several backend plugins, custom permissions, a redesigned homepage and multiple scaffolder actions, often go to a partner for scope control and upgrade discipline, because the written scope, tests and handover documentation are easier to hold a partner to than an internal backlog that competes with other work.
What a Backstage plugin development engagement includes
A plugin engagement usually covers several kinds of extension point, each with its own build and test needs. Every package ends with the same handover: source in your repository, tests, documentation and a working handover session, with the scope agreed in writing before work starts.
Frontend plugins and entity tabs
Frontend work covers custom pages, entity tabs and cards on the homepage, built against the Backstage frontend APIs and the UI components the portal already uses. The main checks are how each view behaves for users without permission to the underlying data, whether it loads acceptably on large catalogs, and which Backstage version the plugin targets. Confirm the frontend wiring approach your portal uses before estimating, because it shapes how the plugin is registered.
Backend plugins with their own database
Backend plugins expose routes and, where needed, store their own data. Backstage gives each backend plugin its own logical database through Knex, so schema changes stay scoped to one plugin. Decisions to settle early include the route contract, how authentication and permission checks are applied to each endpoint, and how migrations run during upgrades. Ask for the migration and rollback approach in writing.
Catalog processors and entity providers
Catalog processors read or emit entities, for example to validate custom fields, derive relationships from source files or pull ownership data from an internal system. Processors run inside the catalog's ingestion loop, so slow or failing logic affects every entity it touches. Scope should define the source systems, the entity kinds affected, the error handling for malformed input and the expected refresh behavior.
Custom scaffolder actions for templates
Scaffolder actions are the steps a Software Template runs, such as creating a repository, registering a component or calling an internal API. A custom action runs with the permissions of the template execution, so its inputs need validation and its outputs need to be predictable. Confirm which systems the action writes to, which credentials it uses and how failures are reported to the person running the template.
Theming and homepage layout
Theming and homepage work adjusts the visual identity of the portal and the arrangement of its home page cards and widgets. It is lower risk than backend work, but it still changes shared components, so it needs visual regression checks across the pages users actually visit. Confirm the brand assets, accessibility targets and the list of homepage widgets in scope, and whether layout settings are stored in code or configuration.
Tests, documentation and handover
Every package delivers source in your own repository and cloud accounts, along with automated tests, a plugin README and a handover session for the engineers who will maintain the code. The README should cover configuration, required permissions, the Backstage version targeted and the upgrade notes. Ask for the test scope, the handover agenda and who receives repository access before work begins.
What drives Backstage plugin development cost and duration
This table lists the factors that move the effort of building Backstage plugins and how each one changes the work. Read each row as a question to answer during scoping: the more a factor is open, the wider the quote range. The main takeaway is that plugin count, integration depth and supported versions usually matter more than the choice of plugin type.
| Driver | Why it moves effort | How to keep it down |
|---|---|---|
| Number of plugins | Each plugin needs its own design, tests, configuration, documentation and upgrade path, so effort grows with count even when each plugin is small. | Bundle related screens or actions into one plugin where ownership is the same, and defer nice-to-have plugins to a later phase. |
| Plugin type (frontend, backend, catalog processor, scaffolder action) | Frontend plugins need UI and API client work, backend plugins add routing, storage and service wiring, and catalog processors and scaffolder actions need schema and error handling tested against real entities or templates. | Prefer an existing extension point or a built-in component when one fits, and keep backend logic in a small number of well-defined modules. |
| Depth of integration with external systems | Every external API adds authentication, pagination, rate limits, error mapping and test doubles, and deep write-back paths need more review than read-only views. | Start with read-only integration and limit each plugin to one external system, adding write actions only after the first version is in use. |
| Authentication and permission checks inside the plugin | Plugins that show or change data per user must resolve identity, call the permission framework and be tested for allowed and denied cases, which adds design and test work. | Reuse the platform's permission and identity APIs instead of custom checks, and agree the permission model before development starts. |
| Data volume and entity count | Large catalogs and high-volume sources require pagination, caching, batching and performance tests, and can change the storage design. | Ask for a representative entity count early, filter at the source, and cache results the plugin reads often. |
| Number of environments | Each environment needs its own configuration, secrets, connectivity and verification, and differences between them cause rework. | Keep configuration in one templated structure with environment-specific values only, and agree a single promotion path. |
| Compliance evidence requirements | When an assessor expects logs, change records, access reviews or test results for the plugin, that evidence must be designed, generated and retained in addition to the feature. | Define the evidence list in the scope, map it to the controls it supports, and collect it from the pipeline rather than by hand. |
| Number of Backstage versions the client must support | Plugins built on the @backstage packages must be checked and adjusted at each upgrade, and supporting more than one release line multiplies that testing. | Commit to one Backstage release line per phase, use the version bump tooling, and plan upgrades as recurring work in the support scope. |
How a Backstage plugin project runs from scope to handover
The sequence moves a plugin idea from a documented extension inventory to a tested, reviewed and handed-over component that the client's team can upgrade and operate. Each phase closes with a named artifact so the client can check progress before the next phase starts.
Inventory the extensions and confirm the Backstage version
DeployOpen reviews the portal's current Backstage version, its installed @backstage packages, and the existing plugins and catalog data the request touches. The team confirms which parts of the framework are needed, such as frontend plugins, backend plugins, catalog processors or scaffolder actions, and checks whether an existing community or built-in plugin already covers the need. The output is an extension inventory listing each requested capability, the framework surface it uses and the client decisions still open. The phase closes when the client signs off the inventory and the target version is recorded.
Write a technical design note for each plugin
For each plugin, DeployOpen writes a design note that names the extension points it uses, the data it reads and writes, the API routes or entity kinds it adds, and the permissions and identity context it depends on. The note also records where the work could break on upgrade, such as reliance on internal or unstable exports. Client architects review the note for fit with their catalog model and security requirements. The phase is complete when the note is approved in writing, because later changes to scope are tracked against it.
Build in a branch against the current Backstage version
Development happens in a feature branch in the client's repository, pinned to the Backstage version agreed in the inventory. DeployOpen keeps the plugin within the public plugin APIs, keeps configuration in the standard app config files, and avoids changes to core packages wherever a plugin can do the job alone. Each plugin is built with its own database access through the framework's supported patterns. The output is a merged pull request containing code, configuration schema and build scripts, with the branch reviewed against the client's coding and release rules.
Test the plugin and produce a test report
DeployOpen runs unit tests for plugin logic, component tests for frontend views, and integration checks against a local PostgreSQL database for backend and catalog behavior. Permission checks, sign-in identity use and error handling are tested against the design note's stated rules. Where a catalog processor or scaffolder action writes to external systems, the tests use mocks or sandbox targets agreed with the client. The phase closes with a test report listing what was run, what passed, known gaps and any follow-up items needed before rollout.
Review the code and the upgrade impact
A second engineer reviews the pull request against the design note, the client's security baseline and the framework's guidance on plugin structure. The review also checks which framework exports and template files the plugin depends on, so the client knows what a future version bump may touch. The client's platform team approves changes they own, such as configuration, access rights or catalog entries. The phase is complete when the review findings are closed and the upgrade impact is written into the handover notes.
Roll out to a non-production portal first
The merged plugin is deployed to a non-production Backstage instance that mirrors the production configuration, including the sign-in provider, database and caching choices. DeployOpen and the client's operators check that the plugin loads, reads the expected catalog data, respects permissions and logs useful errors. Rollout is repeated for production only after the client confirms the staging results. The output is a short rollout record showing the environments tested, the versions deployed and any defects found and fixed.
Hand over the code, runbooks and README
DeployOpen delivers an updated README covering setup, configuration options, required permissions and known limits, plus runbooks for deploying, rolling back and troubleshooting the plugin. Operators are walked through the runbooks and the upgrade impact notes, and the client's team takes ownership of the repository. The handover is done when the client team has run the runbook steps themselves in a non-production environment and the README has been accepted into their repository. Ongoing upgrades and support are a separate agreement and are scoped in writing.
Where Backstage plugin development projects go wrong
Most Backstage customization problems do not show up during the build. They appear later, when the next release lands, the build team rotates off, or a catalog feed starts writing bad data. The cards below cover six failure modes we see most often, each paired with the control that prevents it.
Importing internal Backstage packages
Plugins sometimes reach into internal modules of @backstage packages instead of the exported public APIs. Those internals can change or disappear in any release, so a plugin that works today can fail on the next upgrade. Prevention: restrict plugins to public API exports and review every new import during code review. When assessing an existing plugin, list its @backstage imports and confirm each one is an exported entry point.
Plugin versions drifting from the app
A plugin pinned to a different @backstage package version than the app creates subtle runtime errors that are hard to trace. Teams often discover the mismatch only when they try to upgrade. Prevention: manage @backstage versions through the monorepo workspace so every package moves together, and use the upgrade tooling rather than editing versions by hand. Check that each plugin in the repository resolves to one version of each shared package.
Catalog processors flooding the catalog
A custom catalog processor that emits malformed or duplicate entities can fill the catalog with noise, break relationships between components and owners, and make search results untrustworthy. The failure is usually silent until a team notices missing or wrong entries. Prevention: validate processor output against an entity schema before it is written, reject or log invalid records, and monitor entity counts after each change to the processor.
Scaffolder actions holding broad credentials
Custom scaffolder actions often run with a token that can do far more than the template needs, such as creating repositories across an entire organization or reading every secret in a pipeline. A single template misuse then has a large blast radius. Prevention: give each action its own least-privilege token scoped to the operations it performs, store those tokens in your secrets manager, and review the scopes whenever an action changes.
Plugins left without an owner
Plugins built by a project team often have no named maintainer once that team moves on. Nobody triages failing builds, answers upgrade questions or approves changes, so the plugin quietly decays until it is removed or forked. Prevention: record a named code owner for every custom plugin, action and processor, and point the catalog entry for each one at a team that still exists. Review ownership at each upgrade cycle.
Theming changes breaking on upgrade
Theme overrides and custom homepage styling often depend on internal component class names or markup that the framework changes between releases. The app may look correct at launch and then break visually after an upgrade. Prevention: keep theme changes within documented theming extension points, and run a regression suite of key pages (catalog, templates, TechDocs, homepage) on every upgrade before it reaches users. Confirm the suite covers each custom plugin.
How plugin work changes by starting point
A new app generated from the default template carries the least inherited code, so most design decisions are still open. You can choose where custom plugins live, how they are packaged and whether they follow the new frontend and backend systems from the first commit, which avoids a later migration. The main design task is the plugin boundary: which features belong in a plugin your team owns, which belong in an existing built-in plugin and which should come from an upstream community plugin.
What changes in the design:
- Plugin layout: decide early whether custom plugins sit in the app monorepo or in separate repositories with their own release cycle.
- Wiring style: start new plugins on the current system registration pattern so you do not build on wiring that later needs to move.
- Database layout: each backend plugin gets its own logical database through Knex, so plan PostgreSQL for production from the start even if development uses SQLite.
- Node.js version: pin the build to a Node.js release the versioning policy supports, which were Node.js 22 and 24 as of Backstage 1.46.0.
- Authentication: configure a production sign-in provider before building plugins that read user identity, and keep guest access out of production.
Confirm which Backstage release the template generated and whether the team has agreed on the plugin boundary before the first plugin is merged.
When an app has many plugins on an older release, the first design question is the upgrade path, not new features. Each plugin may declare different versions of Backstage packages and use patterns that changed in later releases. You decide whether to move the core first and then build, or to stabilize the current release and schedule upgrades in smaller steps.
What changes in the design:
- Inventory: list every plugin with its source (internal, community or forked) and the @backstage package versions it declares.
- Version alignment: confirm all @backstage packages move together through the version bump command and that no package is pinned by hand.
- Support window: check whether your release and your Node.js version still fall inside the windows in the versioning policy.
- Security coverage: the policy says high and critical vulnerabilities are backported to releases from the last 6 months where feasible, so an older release may receive fewer fixes.
- Custom code exposure: plugins that import internal APIs usually break first, so review them before the others.
Confirm the target release and whether the move will happen in one step or in stages. The sibling upgrades and support topic covers the upgrade steps, and the Backstage upgrade helper shows the template changes between versions.
Community plugins often fit the portal except for one behavior, and the design choice is how to add that behavior without losing the ability to take upstream updates. You can extend the plugin through configuration or a wrapper plugin, contribute the fix upstream, or fork the plugin and own it. Each option has a different upkeep cost, and the cost usually appears at the next Backstage release rather than at build time.
What changes in the design:
- Patch placement: prefer a wrapper or extension point that leaves the upstream package unmodified, so upstream updates can be applied cleanly.
- Fork ownership: a fork needs a named owner who merges upstream changes and reruns tests on each Backstage release.
- License review: confirm the plugin's license allows your distribution and that required notices stay in place.
- Maintenance status: check the upstream repository for recent activity, open security issues and compatibility with the release you run.
- Upstream contribution: returning fixes upstream reduces long-term divergence but adds review time that you must plan for.
Confirm who owns each fork and how upstream merges are reviewed before the first local change is made. The sibling upgrades topic explains how plugin compatibility is checked during a version bump.
A portal that must run in a private network depends on several sources that are normally public: npm packages, container base images, documentation build tools and external URLs used by templates or catalog processors. Design choices in this model are about where each dependency comes from and how it stays current. The aim is a build that completes with the network path to the public internet blocked.
What changes in the design:
- Package mirror: every npm dependency, including transitive ones, must resolve from an internal registry, and the mirror must hold the versions named in the lockfile.
- Lockfile discipline: commit and review the lockfile, because each version bump requires the mirror to receive the new packages first.
- Build-time fetches: TechDocs generation, scaffolder templates and catalog processors may call external addresses, so list each one and decide whether it stays or moves inside the network.
- Base images: pull the Node.js and runtime images from an internal registry and track their updates on the same schedule as the portal.
- Identity providers: confirm that the sign-in provider runs inside the network or is reachable through an approved path.
Confirm that an offline build and a blocked-egress test both succeed in a staging environment before you commit to the design. The sibling high availability and security hardening topics cover the runtime controls that sit around this setup.
A team moving plugins to the new frontend and backend systems is changing how plugins are wired, not only what they do. The design decision is whether to migrate plugin by plugin while the legacy wiring still runs, or to freeze new plugin work until the migration is complete. The choice affects release planning, test coverage and how long two patterns must coexist in the same app.
What changes in the design:
- Scope classification: sort plugins into three groups: already on the new systems, needs a wrapper, or needs a rewrite.
- Coexistence: decide whether legacy and new plugins can run side by side in one app during cutover, and where that setup ends.
- Extension surface: list the extension points and API calls each plugin uses, because these define how large each rewrite will be.
- Test coverage: confirm each plugin has tests that run during the transition, so behavior can be compared before and after the move.
- Sign-off: name the owner who approves each plugin's cutover.
Confirm the complete plugin inventory before estimating work. The sibling Backstage migration topic covers the staged cutover steps, and the upgrades topic covers the version changes that often happen alongside the migration.
What your team must provide before plugin work starts
The fastest way to get a credible plugin estimate is to hand the partner a working starting point before anyone writes code. Your team should provide five things: a Backstage repository that builds and runs, read-only or test access to every source system the plugins will call, a representative sample of catalog entities, named plugin owners on your side, and a written decision on the authentication provider and permission model. A non-production environment that mirrors the production wiring completes the list. Each item changes either the effort estimate, the design review, or both, so missing items usually show up as schedule slips rather than as visible problems. Start with the repository. Ask for the Backstage version it pins and confirm that the @backstage packages are on one consistent release line. Plugin work depends on the APIs of that version, and a repository with mixed package versions or local patches will add discovery time to every estimate. Also confirm which Node.js version runs in development and CI. Backstage supports two adjacent even-numbered Node.js releases at a time, and the versioning policy lists the supported pair for each release, so check the pair against the version you pin. Ask the partner to confirm in writing which version they will build against and whether they need any upgrade before starting. Next, list the systems each plugin will read from or write to, and for each one provide a read-only or test credential with a named owner. A plugin that needs a ticketing API, a deployment system or a cloud inventory cannot be designed properly until the team can see real response shapes, rate limits and error behavior. Credentials should be scoped to test data where possible. Ask the partner to confirm which calls will be read-only in the first phase and which, if any, will be actions executed from the scaffolder, since write paths need a separate review of token scope and audit logging. The sample catalog and the identity decision shape the first design review. A sample of catalog entities, including components, systems, APIs, resources and groups with owners, lets the team test entity relations and annotations against real data. Identity matters just as much: Backstage ships 19 built-in authentication providers, and its authentication documentation advises that sign-in resolvers map every provider to the same identity and that guest access is not offered in production. Decide which provider you use, how users map to catalog entities, and who approves the permission model. Ask the partner to confirm in writing which permission checks each plugin will enforce, because retrofitting them after build is costly. Finally, name plugin owners and a non-production environment. Owners on your side answer design questions, approve scope changes and accept the plugin into operation after handover. Without them, reviews stall. The non-production environment should run a database, authentication and the same reverse proxy path as production so that plugin behavior can be verified before release. Ask the partner to confirm in writing the list of inputs they need, the date each is due, and what happens to the schedule if one arrives late.
Which plugin work teams keep in-house and which they outsource
This table compares each part of Backstage plugin work with its usual owner and the skills it needs. Read it as a starting split: teams usually keep product decisions and long-term ownership, while a partner often builds and documents the extensions. Use the skills column to check whether your own staff already cover each row.
| Work area | Typical owner | Skills it needs |
|---|---|---|
| Defining what the portal should show | In-house | Product ownership, developer workflow knowledge, catalog data sources, stakeholder interviews |
| Writing the first frontend plugin | Shared | TypeScript, React, Backstage frontend APIs and extension points, the Backstage CLI |
| Backend plugin with data access | Partner | TypeScript, Node.js, Express-style routing, PostgreSQL via Knex, Backstage backend service APIs |
| Catalog processors | Partner | TypeScript, the Backstage catalog processing model, entity schemas, source system APIs |
| Scaffolder actions | Shared | TypeScript, Node.js, Software Templates syntax, repository and CI provider APIs, input validation |
| Theming and homepage layout | Shared | React, CSS or the Backstage theme API, design system conventions, accessibility basics |
| Upgrade and test maintenance | Partner | Backstage release process, yarn workspaces, Jest and test harness tooling, Backstage Upgrade Helper usage |
| Ongoing ownership and plugin upkeep | In-house | Node.js release tracking, code review, on-call routing, documentation upkeep, Backstage versioning policy |
Keeping custom Backstage plugins affordable after go-live
The largest cost of a custom Backstage plugin usually arrives after go-live, not during the build. Each plugin you own becomes a recurring obligation: it has to stay on the same Backstage release line as your app, it has to keep working as the framework moves, and someone has to answer for it when it breaks. Before you approve a build, decide who carries that obligation and how much of their time it will take.
The release cadence is the main driver. According to the Backstage release and versioning policy, the main release line ships monthly, on the Tuesday before the third Wednesday of each month, and the next release line ships weekly on Tuesdays. Every custom plugin needs to be tested against each main release that your organization adopts, because plugins import @backstage packages and those packages change. Ask your team or any partner how many releases they expect to test per year, which release line they will track, and whether testing is included in the quote or billed separately as upkeep.
Two other recurring triggers deserve a line item. The versioning policy supports exactly two adjacent even-numbered Node.js releases, and as of Backstage 1.46.0 these are Node.js 22 and 24. When that window moves, plugins that rely on Node-specific behavior or native dependencies may need changes, and your hosting images will need rebuilding. Security fixes are the other trigger. The policy says high and critical severity vulnerabilities will always be backported to releases from the last 6 months if feasible, and other security fixes may be backported. That means you may need to take a patched release on short notice, and a plugin that has drifted far from the main line makes that harder.
The biggest cost factor is how deeply a plugin reaches into internal Backstage APIs. A plugin that uses only the documented extension points and public packages tends to survive upgrades with small changes. A plugin that imports internal modules, patches core behavior or copies framework code will break in ways that need investigation each cycle. The cost of a plugin therefore depends mostly on its coupling to internals, and you can reduce it at design time by asking the builder to list every non-public import and justify it in writing.
Before you sign with any partner, ask for a written upkeep model. It should state which Backstage release lines are covered, how security backports are handled and at what response expectations, who owns each plugin's documentation and named owner in the catalog, how Node.js window changes are scheduled, and what is one-time versus recurring. It should also say what is excluded, such as new features or changes requested by your teams. Confirm these terms against your own environment and internal change process, not only against the vendor's general description.
Backstage plugin development questions buyers ask
How much does custom Backstage plugin work cost?
The cost depends on the scope of the plugin work, and a written, fixed-scope quote is the only reliable way to get a number for your case. The main drivers are how many plugins you need, whether each one is frontend, backend, or both, how many external systems they must call, and how much existing data model work sits underneath them. Custom catalog processors and scaffolder actions often take more design time than a simple UI panel because they touch shared data and automation. Ask the provider to split the quote into discovery, build, testing, documentation, and handover, and to state which items are one-time and which recur, such as upkeep for each plugin after each Backstage upgrade. Backstage itself is released under the Apache License 2.0, so there is no license fee for the framework. The cost you pay for is people and hosting, not the software.
How long does a typical Backstage plugin take to build?
A plugin's duration depends mostly on its integration surface, not on its screen count. A plugin that reads data from one well-documented API and renders a single page is much shorter to deliver than one that needs authentication, permission checks, caching, a database table, and tests against several upstream systems. Other factors include how clear the requirements are, how quickly your team can review designs, access to test accounts in the source systems, and whether your Backstage app already follows the current frontend and backend wiring. Plan for an discovery step where the data contract and ownership are agreed before any code is written. Ask for the timeline as a set of milestones with named reviews, and confirm which dependencies on your side could push those dates.
Can our own engineers build Backstage plugins without a partner?
Yes, many platform teams build plugins in-house, and Backstage is designed for that. The question is whether you have the skills and capacity to keep the plugins working over time. Building a plugin needs TypeScript and React knowledge for the frontend, Node.js and the Backstage backend APIs for the backend, and an understanding of the catalog model and permission framework. Maintaining plugins needs someone to track each monthly main release and the weekly next line, update packages with the version bump tooling, and read the Upgrade Helper output for template changes. Be honest with yourself about who will own each plugin after launch. If that person is a single engineer, a partner can help with the first build and handover, while your team keeps the knowledge and the upgrade routine.
What do we need to provide for a plugin engagement?
The engagement will go faster if you prepare a few things before work starts. You will need named business owners who can decide what the plugin shows and who can use it, technical contacts for each source system, and read access or sandbox credentials for those systems. You also need a Backstage environment where the work can be developed and tested, including a non-production instance and a way to run it with your sign-in provider. Access to your code hosting, container registry, and CI pipeline is usually required so that the plugin is delivered as a normal part of your repository. Finally, agree on who reviews designs and who approves releases. Missing access and slow reviews are common causes of schedule slippage, so ask the provider to list these inputs in the written scope.
How do custom plugins affect future Backstage upgrades?
Custom plugins are the part of a Backstage app most likely to need attention during an upgrade, because they depend on framework APIs that can change. Backstage ships a main release each month and a next release line each week, and the project backports high and critical security fixes to releases from the last six months where feasible. Plugins that stick to documented extension points, keep their package versions aligned with the @backstage packages, and have automated tests usually move forward with less effort. Plugins that reach into internal modules or depend on deprecated patterns need more rework. Ask for a plugin design that uses supported APIs, a test suite that runs on each upgrade, and a short upgrade note for each plugin that names its external dependencies.
Who owns the plugin code after the engagement ends?
Ownership should be settled in the contract before development starts, not after. Backstage is released under the Apache License 2.0, which lets you use, modify, and distribute the framework, and the same license applies to the framework code you build upon. Your own plugin code is typically delivered into your repositories, but the exact terms for ownership, reuse, and any third-party components should be written into the agreement. Confirm three things: who holds the copyright to the delivered code, whether the provider may reuse generic parts in other work, and which open-source licenses your dependencies carry. Ask your legal or procurement team to review the terms, because this is a contract question that depends on your jurisdiction and policies.
What should a Backstage plugin handover include?
A handover should leave your team able to run, change, and upgrade each plugin without the provider. At minimum, expect the source code in your repository, a README with setup and configuration steps, and a description of the data each plugin reads and writes. Include the permission and sign-in rules each plugin relies on, the secrets it needs and where they are stored, and the test commands. Ask for a runbook that explains how to check the plugin after a Backstage upgrade and how to roll it back if needed. A short walkthrough recorded for your engineers, plus a list of open issues, helps the next maintainer start quickly. Confirm the handover checklist in the written scope so that acceptance is based on specific items.
What are the common mistakes teams make with custom Backstage plugins?
The most common mistake is building a plugin before the data model is agreed. If the catalog entities, owners, and annotations are inconsistent, every plugin built on top will need rework. The second is giving a plugin broad access to upstream systems instead of the narrow read permissions it needs, which creates security and audit problems later. Teams also skip tests for backend routes and scaffolder actions, then find breaks during monthly upgrades. Another frequent issue is leaving sign-in and guest access settings unchecked, so plugins expose data to people who should not see it. Ask your provider how they will cover the data model, access scope, and testing in the plan, and confirm which of these items are included in the fixed scope.
How DeployOpen works on this
DeployOpen treats each Backstage plugin or customization as a fixed-scope piece of work with written deliverables, built inside your own infrastructure. The work is structured around Backstage's release line and plugin conventions so that later upgrades stay manageable for your team.
How we scope
- The written scope names each plugin, scaffolder action, catalog processor or theme change, with its inputs and outputs.
- We confirm which Backstage frontend and backend wiring your app uses before estimating any plugin work.
- Engagements are fixed-scope, and any ongoing support is available as a separate retainer.
How we build
- Custom plugins follow Backstage's plugin structure and keep @backstage package versions aligned with the rest of the app.
- Each backend plugin gets its own database through Knex, with PostgreSQL in production and SQLite for local development.
- Permissions, sign-in resolvers and secrets handling are reviewed in each change, not left for a final pass.
How we hand over
- You receive source code in your repository, with setup notes, configuration reference and a short upgrade checklist.
- Test coverage and a walkthrough of each plugin are delivered alongside the code so your team can maintain it.
- We document any template or theme changes that depend on specific Backstage versions so the next upgrade is traceable.
How we support
- A support retainer can cover upgrades to new monthly main releases, plugin compatibility checks and security fixes.
- Ask the support proposal to state which Backstage release lines and Node.js versions it covers.
- Confirm with us how plugin changes are tested against the Upgrade Helper before any version bump is applied.

