A Managed Package is a distribution unit ISVs publish on the AppExchange. Once installed, components carry the publisher namespace prefix and are upgrade-managed.
Key developer implications:
- Namespace prefix: every API name is prefixed (
acme__Field__c). Code outside the package referencing these names must include the prefix. - Code is hidden: customers can't see your Apex source.
- Schema is partially open: customers can add fields to packaged objects but can't remove the packaged ones.
- Versioned upgrades: new versions install over old; can add fields/classes; can't easily remove without deprecation.
- Global vs Public APIs: only
globalApex is accessible from outside the namespace. Be deliberate. - Test coverage: package code must have 75% test coverage with tests included.
- Subscriber sharing: package code respects installing org sharing if
with sharing. - Package limits: managed packages have their own limits separate from customer's org limits.
For developers: architect for upgradability, use Unlocked Packages for internal modular dev, test in real subscriber orgs, version interfaces.
For developers in customer orgs with packages: don't depend on internals (only global is stable), reference by full namespace, watch the upgrade cycle.
