Skip to content

Customize an installed plugin ​

What you're doing ​

Making HCM, CRM or any installed plugin serve your business without modifying it. The original stays as shipped, so its upgrades stay safe. This is how SAP, Odoo, Dynamics 365, Salesforce and ERPNext work too.

Pick the lightest tool that does the job:

You want toUse
Change one label, hide or add one block on a shipped pageLayered override
Add your own data, screens, rules, workflows on topExtend
Run your own logic when a record is savedExtension point
Take over the whole pluginCopy

Extend it ​

Installed, Customize... , Extend. Studio starts a plugin of your own that depends on the installed one. The original keeps receiving updates. Your plugin declares the versions it works with (for example >=2.0.0 <3.0.0); the platform refuses to install it against another version. Only plugins with "extendable": true can be extended.

Copy it ​

Installed, Customize... , Copy. An editable copy under a new id at version 1.0.0, with the original's screens, data definitions and workflows (and Java source when the package shipped it). It is a fork: you merge later changes. It keeps the original's artifact names, so install it in place of the original. Compiled libraries and database migrations are not copied.

Layered overrides ​

Open the plugin's page, form or dashboard and choose Customize... (History tab). Add changes:

ChangeEffect
Change a settingsets one value in a block, for example properties.text.value to Team roster
Removetakes a block out
Replaceswaps a block
Add before / afteradds a block next to one
Add into a listadds an item, such as a grid column

Each change points at a block by its instance id. Check shows how many apply to the current version; Save changes stores them; Use the shipped version removes them. If an upgrade removes a block a change points at, that change is skipped, the page still works, and the editor lists it.

Extension points ​

A named moment where your own service steps in. Built in for every record: EntityRecordBeforeCreate, EntityRecordBeforeUpdate (return field values to merge), EntityRecordBeforeDelete (answer {"valid": false, "message": "..."} to stop it), and the informational After versions. Calls have a 2-second timeout and a circuit breaker; if your service fails the platform carries on. A plugin can declare its own points in plugin.json under extensionPoints. Binding a REPLACE point needs an elevated permission.

Upgrading a plugin that has extensions ​

Before an upgrade the platform checks each installed extension against the new version. If one is outside its declared range the upgrade stops and lists them. Upgrade those first, or use force (--force-upgrade in the CLI); it is recorded in the audit log.

Check it worked ​

Extension: it appears in Installed with its base named. Override: the page shows your change, and ?base=true on the page shows the shipped version.

Common mistakes ​

  • Trying to edit a locked artifact: use Customize.
  • Extending a plugin that is not extendable: ask its publisher, or copy it.