Creating an unmanaged package is a Setup-driven workflow. Pick the components, declare them as a package, upload, and share the install URL. No CLI, no security review, no marketplace listing.
- Open Packages in Setup
Setup, Packages, search for Package Manager. If your org is on a recent edition, this is in the Apps section of Setup. The Packages page lists the unmanaged and managed packages your org has authored.
- Click New and pick Unmanaged
Click New. Give the package a name (visible to subscribers), a description, and a language. Leave Managed unchecked. The choice between unmanaged and managed is permanent for the package.
- Add components to the package
Click Add Components, then select the metadata: custom objects, Apex classes, Flow definitions, Visualforce pages, custom fields. The Add Components UI lists every metadata type. Pick deliberately. Each added component pulls in its dependencies.
- Validate dependencies and security
Click Save. The platform validates that all referenced components are included. Missing dependencies (a Flow that references a field not in the package) cause validation errors. Fix and re-save.
- Upload and generate the install URL
From the package detail page, click Upload. Give the version a name (1.0, 1.1, 2.0) and a description. The platform generates an install URL. The URL is permanent until you delete the package version.
- Share the URL and walk the subscriber through install
Send the install URL to the subscriber. They click through the standard package install flow: pick org, accept terms, select profile mode (Admins Only, All Users, Specific Profiles), and install.
Subscriber-visible name. Permanent once components have been added. Pick deliberately, especially if you plan to distribute beyond a small audience.
The metadata included in the package. Custom objects, Apex, Flow, Visualforce, custom fields, validation rules, page layouts, permission sets are all packageable.
Free-text version name and the platform-tracked version number. Versions accumulate; each upload creates a new install URL.
Set by the subscriber at install time: Admins Only, All Users, Specific Profiles. Same as managed packages.
Unmanaged packages do not support License Manager. No per-user licensing, no seat counts, no usage tracking. Use managed packages for licensed distribution.
- Unmanaged packages do not have namespaces. Component names collide with components of the same name from other unmanaged packages. Only use for single-source internal distribution.
- There is no upgrade path. Shipping a v2 means asking the subscriber to uninstall v1 (losing data) and install v2 fresh. Plan around one-shot installs only.
- Apex code is fully readable and editable by subscribers. Do not ship proprietary algorithms in unmanaged packages. Use managed packages with private/public visibility for that.
- Unlocked packages from Salesforce DX are the modern alternative for internal distribution. For new use cases, evaluate unlocked packages before defaulting to unmanaged.
- Some components cannot be added to unmanaged packages (certain platform features, deeply org-coupled metadata). The validation step on save catches most of these. Plan a workaround in advance.