{"id":30223,"date":"2025-11-18T09:49:49","date_gmt":"2025-11-18T14:49:49","guid":{"rendered":"https:\/\/www.jitendrazaa.com\/blog\/?p=30223"},"modified":"2025-12-08T14:32:57","modified_gmt":"2025-12-08T19:32:57","slug":"salesforce-packaging-options-a-comprehensive-guide-for","status":"publish","type":"post","link":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/salesforce-packaging-options-a-comprehensive-guide-for\/","title":{"rendered":"Salesforce Packaging Options &#8211; A Comprehensive Guide for Enterprise Development"},"content":{"rendered":"\n<p>Salesforce provides multiple packaging mechanisms for distributing metadata and code across organizations. Choosing the right package type depends on your distribution goals, intellectual property requirements, and organizational structure. This analysis examines five primary package types and provides recommendations for enterprise code distribution.<\/p>\n\n\n\n<!--more-->\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"package-types-overview\">Package Types Overview<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"1-unmanaged-packages\">1. Unmanaged Packages<\/h3>\n\n\n\n<p>Unmanaged packages are collections of application components that can be distributed and installed in other Salesforce orgs. Once installed, the components become editable by administrators and developers in the target org.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"characteristics\">Characteristics<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Editability<\/strong><\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Fully editable after installation<\/td>\n<\/tr>\n<tr>\n<td><strong>Upgradeability<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\"><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg1_dev.meta\/pkg1_dev\/packaging_developing_unmanaged.htm\">No upgrade path &#8211; one-time deployment only<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>IP Protection<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">None &#8211; all code is visible and modifiable<\/td>\n<\/tr>\n<tr>\n<td><strong>Namespace<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">Not required<\/td>\n<\/tr>\n<tr>\n<td><strong>Use Case<\/strong><\/td>\n<td>Open-source distribution, templates, one-time transfers<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"pros\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simple to create and distribute<\/li>\n\n\n\n<li>Recipients can fully customize the code<\/li>\n\n\n\n<li>No ongoing maintenance required from publisher<\/li>\n\n\n\n<li>No namespace prefix added to components<\/li>\n\n\n\n<li>Good for sharing templates and starter code<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"cons\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg1_dev.meta\/pkg1_dev\/packaging_developing_unmanaged.htm\">No version control or upgrade capability<\/a><\/li>\n\n\n\n<li>No intellectual property protection<\/li>\n\n\n\n<li>Changes must be manually tracked<\/li>\n\n\n\n<li>Cannot push updates to installed orgs<\/li>\n\n\n\n<li>No way to recall or enforce standards<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"best-use-cases\">Best Use Cases<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg1_dev.meta\/pkg1_dev\/packaging_developing_unmanaged.htm\">Distributing open-source projects<\/a> to developers<\/li>\n\n\n\n<li>One-time deployment of applications requiring customization<\/li>\n\n\n\n<li>Sharing code templates or starter kits<\/li>\n\n\n\n<li>Internal proof-of-concept transfers<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"2-managed-packages-first-generation-1gp\">2. Managed Packages (First-Generation &#8211; 1GP)<\/h3>\n\n\n\n<p>First-generation managed packages are the traditional method for ISVs to distribute applications on AppExchange. They provide intellectual property protection and version management.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"characteristics_1\">Characteristics<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Editability<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\"><a href=\"https:\/\/help.salesforce.com\/s\/articleView?id=sf.os_managed_and_unmanaged_components_in_managed_packages.htm\">Limited &#8211; subscribers cannot modify protected components<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Upgradeability<\/strong><\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Push upgrades available to subscribers<\/td>\n<\/tr>\n<tr>\n<td><strong>IP Protection<\/strong><\/td>\n<td style=\"background-color: #d4edda;color: #155724\"><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.packagingGuide.meta\/packagingGuide\/packaging_protect_ip.htm\">Full Apex obfuscation and component locking<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Namespace<\/strong><\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Required (unique per package)<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Development Model<\/strong><\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Org-based (packaging org is source of truth)<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"pros_1\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.packagingGuide.meta\/packagingGuide\/packaging_protect_ip.htm\">Full intellectual property protection<\/a><\/li>\n\n\n\n<li>Automatic code obfuscation for Apex<\/li>\n\n\n\n<li>Version management and upgrade paths<\/li>\n\n\n\n<li>License management capabilities<\/li>\n\n\n\n<li>AppExchange distribution ready<\/li>\n\n\n\n<li>Push upgrades to subscriber orgs<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"cons_1\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Org-based development model limits collaboration<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Each package requires unique namespace<\/a>, causing proliferation of global Apex<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Managing hundreds of packaging orgs becomes complex<\/a><\/li>\n\n\n\n<li>Difficult to adopt modern CI\/CD practices<\/li>\n\n\n\n<li><a href=\"https:\/\/trailhead.salesforce.com\/content\/learn\/modules\/unlocked-packages-for-customers\/break-up-your-metadata\">Monolithic architecture encouraged<\/a><\/li>\n\n\n\n<li>Limited code sharing between packages<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"when-to-use\">When to Use<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Legacy AppExchange applications<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">When specific metadata types only support 1GP<\/a><\/li>\n\n\n\n<li>When dependent packages must be 1GP<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"3-second-generation-managed-packages-2gp\">3. Second-Generation Managed Packages (2GP)<\/h3>\n\n\n\n<p>Second-generation managed packages represent the modern approach to ISV development, combining intellectual property protection with source-driven development practices.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"characteristics_2\">Characteristics<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Editability<\/strong><\/td>\n<td style=\"background-color: #e9ecef;color: #495057\">Limited &#8211; same protection as 1GP<\/td>\n<\/tr>\n<tr>\n<td><strong>Upgradeability<\/strong><\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Version and patch upgrades supported<\/td>\n<\/tr>\n<tr>\n<td><strong>IP Protection<\/strong><\/td>\n<td style=\"background-color: #d4edda;color: #155724\"><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.packagingGuide.meta\/packagingGuide\/packaging_protect_ip.htm\">Full Apex obfuscation<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Namespace<\/strong><\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Multiple packages can share same namespace<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Development Model<\/strong><\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp.htm\">Source-driven (version control is source of truth)<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Code Coverage<\/strong><\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_code_coverage.htm\">Minimum 75% required for release<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"key-advantages-over-1gp\">Key Advantages Over 1GP<\/h4>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2025\/12\/salesforce-1gp-vs-2gp-comparison-29.png?ssl=1\" alt=\"1GP vs 2GP Comparison showing differences between First-Generation and Second-Generation managed packages\" style=\"width:auto;height:500px\"\/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"pros_2\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp.htm\">Source-driven development with version control as source of truth<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Multiple packages can share a single namespace<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">Single Dev Hub org manages all packages<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_plan_best_practices.htm\">Full CI\/CD integration capability<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/trailhead.salesforce.com\/content\/learn\/modules\/unlocked-packages-for-customers\/break-up-your-metadata\">Modular package architecture<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">@namespaceAccessible annotation for code sharing<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/blogs\/2023\/05\/move-to-managed-2gp-with-package-migrations\">Package Migrations feature for 1GP conversion<\/a><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"cons_2\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_code_coverage.htm\">75% code coverage required for release<\/a><\/li>\n\n\n\n<li>Learning curve for source-driven development<\/li>\n\n\n\n<li>Requires Dev Hub org setup<\/li>\n\n\n\n<li>Some metadata types may not be supported yet<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"namespace-sharing-example\">Namespace Sharing Example<\/h4>\n\n\n\n<p>With 2GP, you can <a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\">share Apex code across packages<\/a> using the @namespaceAccessible annotation:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: java; first-line: 1; title: ; notranslate\" title=\"\">\n@namespaceAccessible\npublic class SharedUtility {\n    @namespaceAccessible\n    public static String formatCurrency(Decimal amount) {\n        return &#039;$&#039; + amount.format();\n    }\n}\n\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"4-unlocked-packages\">4. Unlocked Packages<\/h3>\n\n\n\n<p>Unlocked packages are designed for enterprise customers and internal development teams. They provide the benefits of modular development without the restrictions of managed packages.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"characteristics_3\">Characteristics<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Editability<\/strong><\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_intro.htm\">Administrators can modify installed components<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Upgradeability<\/strong><\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Full version and upgrade support<\/td>\n<\/tr>\n<tr>\n<td><strong>IP Protection<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">None &#8211; code is visible<\/td>\n<\/tr>\n<tr>\n<td><strong>Namespace<\/strong><\/td>\n<td style=\"background-color: #e9ecef;color: #495057\"><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_plan_namespaces.htm\">Optional (recommended for multiple teams)<\/a><\/td>\n<\/tr>\n<tr>\n<td><strong>Code Coverage<\/strong><\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_code_coverage.htm\">75% required for promotion to released<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"pros_3\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_intro.htm\">Ideal for internal business applications<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/blogs\/2018\/06\/working-with-modular-development-and-unlocked-packages-part-1\">Modular development with dependency management<\/a><\/li>\n\n\n\n<li>Version control integration<\/li>\n\n\n\n<li><a href=\"https:\/\/trailhead.salesforce.com\/content\/learn\/modules\/unlocked-packages-for-customers\">Repeatable, scriptable deployments<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_intro.htm\">Administrators can still modify metadata after installation<\/a><\/li>\n\n\n\n<li>Supports modern DevOps practices<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/blogs\/2018\/06\/working-with-modular-development-and-unlocked-packages-part-1\">Team-based ownership of packages<\/a><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"cons_3\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No intellectual property protection<\/li>\n\n\n\n<li>Not suitable for AppExchange distribution<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_code_coverage.htm\">75% code coverage for released versions<\/a><\/li>\n\n\n\n<li>Package version creation has daily limits<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/blogs\/2018\/06\/working-with-modular-development-and-unlocked-packages-part-1\">~8 minute wait for package version creation<\/a><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"modular-architecture-benefits\">Modular Architecture Benefits<\/h4>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2025\/12\/salesforce-modular-architecture-29.png?ssl=1\" alt=\"Monolithic vs Modular Architecture comparison for Salesforce package development\" style=\"width:auto;height:500px\"\/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"5-org-dependent-unlocked-packages\">5. Org-Dependent Unlocked Packages<\/h3>\n\n\n\n<p>Org-dependent unlocked packages are a specialized variant designed for complex, legacy Salesforce orgs that have accumulated tightly coupled metadata over years.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"characteristics_4\">Characteristics<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Feature<\/th><th>Description<\/th><\/tr><\/thead><tbody><tr><td><strong>Dependencies<\/strong><\/td><td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_org_dependent.htm\">Can depend on unpackaged metadata in target org<\/a><\/td><\/tr><tr><td><strong>Migration Path<\/strong><\/td><td>Incremental modernization of legacy orgs<\/td><\/tr><tr><td><strong>Flexibility<\/strong><\/td><td>Higher than standard unlocked packages<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"pros_4\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_org_dependent.htm\">Perfect for legacy orgs with complex dependencies<\/a><\/li>\n\n\n\n<li>Incremental path to modular architecture<\/li>\n\n\n\n<li>No need to package all dependencies upfront<\/li>\n\n\n\n<li>Reduces refactoring effort for existing orgs<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"cons_4\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Can only be installed in specific org configurations<\/li>\n\n\n\n<li>Less portable than standard unlocked packages<\/li>\n\n\n\n<li>May perpetuate technical debt if overused<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"comparison-matrix\">Comparison Matrix<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Unmanaged<\/th>\n<th>Managed 1GP<\/th>\n<th>Managed 2GP<\/th>\n<th>Unlocked<\/th>\n<th>Org-Dependent<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>IP Protection<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">None<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Full<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Full<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">None<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">None<\/td>\n<\/tr>\n<tr>\n<td><strong>Upgradeable<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<\/tr>\n<tr>\n<td><strong>Subscriber Editable<\/strong><\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #e9ecef;color: #495057\">Limited<\/td>\n<td style=\"background-color: #e9ecef;color: #495057\">Limited<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<\/tr>\n<tr>\n<td><strong>AppExchange Ready<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<\/tr>\n<tr>\n<td><strong>Namespace Required<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #e9ecef;color: #495057\">Optional<\/td>\n<td style=\"background-color: #e9ecef;color: #495057\">Optional<\/td>\n<\/tr>\n<tr>\n<td><strong>Source-Driven Dev<\/strong><\/td>\n<td style=\"background-color: #e9ecef;color: #495057\">N\/A<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<\/tr>\n<tr>\n<td><strong>CI\/CD Integration<\/strong><\/td>\n<td style=\"background-color: #e9ecef;color: #495057\">Limited<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">Poor<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Excellent<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Excellent<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Excellent<\/td>\n<\/tr>\n<tr>\n<td><strong>Modular Architecture<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">Poor<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<\/tr>\n<tr>\n<td><strong>Code Coverage Req.<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">None<\/td>\n<td>75%<\/td>\n<td>75%<\/td>\n<td>75%*<\/td>\n<td>75%*<\/td>\n<\/tr>\n<tr>\n<td><strong>License Management<\/strong><\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Yes<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<td style=\"background-color: #f8d7da;color: #721c24\">No<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p>*For released versions only<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"decision-framework-which-package-type-to-use\">Decision Framework: Which Package Type to Use?<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter is-resized\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2025\/12\/salesforce-packaging-decision-flowchart-29.png?ssl=1\" alt=\"Salesforce Package Type Decision Flowchart - choosing between Managed 2GP, 1GP, Unlocked, Unmanaged, and Org-Dependent packages\" style=\"width:auto;height:600px\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"quick-reference-guide\">Quick Reference Guide<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Scenario<\/th>\n<th>Recommended Package<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Internal enterprise app development<\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_intro.htm\"><strong>Unlocked Package<\/strong><\/a><\/td>\n<\/tr>\n<tr>\n<td>AppExchange ISV with modern practices<\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp.htm\"><strong>Managed 2GP<\/strong><\/a><\/td>\n<\/tr>\n<tr>\n<td>Legacy AppExchange app maintenance<\/td>\n<td><strong>Managed 1GP<\/strong> or migrate to 2GP<\/td>\n<\/tr>\n<tr>\n<td>Sharing open-source code\/templates<\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg1_dev.meta\/pkg1_dev\/packaging_developing_unmanaged.htm\"><strong>Unmanaged Package<\/strong><\/a><\/td>\n<\/tr>\n<tr>\n<td>Modernizing complex legacy org<\/td>\n<td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_org_dependent.htm\"><strong>Org-Dependent Unlocked<\/strong><\/a><\/td>\n<\/tr>\n<tr>\n<td>Distributing IP-protected code internally<\/td>\n<td style=\"background-color: #d4edda;color: #155724\">Consider <strong>Managed 2GP<\/strong> (yes, even internal)<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"best-practices-for-distributing-common-code-in-an-organization\">Best Practices for Distributing Common Code in an Organization<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"strategy-1-modular-unlocked-package-architecture\">Strategy 1: Modular Unlocked Package Architecture<\/h3>\n\n\n\n<p>For most enterprises, the recommended approach is a <a href=\"https:\/\/developer.salesforce.com\/blogs\/2018\/06\/working-with-modular-development-and-unlocked-packages-part-1\">layered unlocked package architecture<\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2025\/12\/salesforce-layered-architecture-29.png?ssl=1\" alt=\"Layered Package Architecture showing Application, Integration, Data, and Core layers\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"strategy-2-team-based-package-ownership\">Strategy 2: Team-Based Package Ownership<\/h3>\n\n\n\n<p><a href=\"https:\/\/developer.salesforce.com\/blogs\/2018\/06\/working-with-modular-development-and-unlocked-packages-part-1\">Assign teams to own specific packages<\/a> for better accountability:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Team<\/th><th>Package<\/th><th>Responsibilities<\/th><\/tr><\/thead><tbody><tr><td>Platform Team<\/td><td>Core Utilities<\/td><td>Shared libraries, security<\/td><\/tr><tr><td>Data Team<\/td><td>Data Model<\/td><td>Objects, fields, relationships<\/td><\/tr><tr><td>Integration Team<\/td><td>Integration Package<\/td><td>APIs, MuleSoft connectors<\/td><\/tr><tr><td>Sales Dev Team<\/td><td>Sales App<\/td><td>Sales-specific features<\/td><\/tr><tr><td>Service Dev Team<\/td><td>Service App<\/td><td>Case management features<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"strategy-3-namespace-considerations\">Strategy 3: Namespace Considerations<\/h3>\n\n\n\n<p><strong>Without Namespace:<\/strong>\n&#8211; Simpler for single-team organizations\n&#8211; Easier metadata references\n&#8211; No prefix on API names<\/p>\n\n\n\n<p><strong>With Namespace:<\/strong>\n&#8211; <a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_plan_namespaces.htm\">Recommended for multi-team environments<\/a>\n&#8211; Clear ownership boundaries\n&#8211; Prevents naming conflicts\n&#8211; Required if you might distribute externally later<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"strategy-4-version-control-structure\">Strategy 4: Version Control Structure<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>salesforce-packages\/\n\u251c\u2500\u2500 sfdx-project.json\n\u251c\u2500\u2500 packages\/\n\u2502   \u251c\u2500\u2500 core-utilities\/\n\u2502   \u2502   \u251c\u2500\u2500 main\/default\/\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 classes\/\n\u2502   \u2502   \u2502   \u251c\u2500\u2500 triggers\/\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 objects\/\n\u2502   \u2502   \u2514\u2500\u2500 test\/default\/\n\u2502   \u251c\u2500\u2500 data-model\/\n\u2502   \u251c\u2500\u2500 sales-app\/\n\u2502   \u2514\u2500\u2500 service-app\/\n\u251c\u2500\u2500 scripts\/\n\u2502   \u251c\u2500\u2500 create-scratch-org.sh\n\u2502   \u2514\u2500\u2500 deploy-packages.sh\n\u2514\u2500\u2500 .github\/\n    \u2514\u2500\u2500 workflows\/\n        \u2514\u2500\u2500 ci-cd.yml\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"implementation-roadmap\">Implementation Roadmap<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Want to master Salesforce DX and packaging? Check out my Salesforce DX course on Udemy for hands-on training covering scratch orgs, unlocked packages, CI\/CD pipelines, and more.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"phase-1-assessment\">Phase 1: Assessment<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Analyze existing metadata<\/strong> &#8211; Catalog all components<\/li>\n\n\n\n<li><strong>Identify package boundaries<\/strong> &#8211; Group related functionality<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"phase-2-setup\">Phase 2: Setup<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Enable Dev Hub<\/strong> in your production org<\/li>\n\n\n\n<li><strong>Define namespace<\/strong> (if using)<\/li>\n\n\n\n<li><strong>Create package structure<\/strong> in sfdx-project.json<\/li>\n\n\n\n<li><strong>Establish CI\/CD pipelines<\/strong><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"phase-3-development\">Phase 3: Development<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Start with core package<\/strong> containing shared utilities<\/li>\n\n\n\n<li><strong>Add dependent packages<\/strong> incrementally<\/li>\n\n\n\n<li><strong>Implement automated testing<\/strong><\/li>\n\n\n\n<li><strong>Validate in scratch orgs<\/strong><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"phase-4-deployment\">Phase 4: Deployment<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Deploy to sandbox<\/strong> for UAT<\/li>\n\n\n\n<li><strong>Promote packages<\/strong> to released status<\/li>\n\n\n\n<li><strong>Install in production<\/strong><\/li>\n\n\n\n<li><strong>Monitor and iterate<\/strong><\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"package-dependencies-and-architecture\">Package Dependencies and Architecture<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dependency-declaration\">Dependency Declaration<\/h3>\n\n\n\n<p>In <code>sfdx-project.json<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: jscript; first-line: 1; title: ; notranslate\" title=\"\">\n{\n  &quot;packageDirectories&quot;: &#x5B;\n    {\n      &quot;path&quot;: &quot;packages\/core-utilities&quot;,\n      &quot;package&quot;: &quot;Core Utilities&quot;,\n      &quot;versionName&quot;: &quot;Winter &#039;26&quot;,\n      &quot;versionNumber&quot;: &quot;1.0.0.NEXT&quot;\n    },\n    {\n      &quot;path&quot;: &quot;packages\/sales-app&quot;,\n      &quot;package&quot;: &quot;Sales App&quot;,\n      &quot;versionName&quot;: &quot;Winter &#039;26&quot;,\n      &quot;versionNumber&quot;: &quot;1.0.0.NEXT&quot;,\n      &quot;dependencies&quot;: &#x5B;\n        {\n          &quot;package&quot;: &quot;Core Utilities&quot;,\n          &quot;versionNumber&quot;: &quot;1.0.0.LATEST&quot;\n        }\n      ]\n    }\n  ],\n  &quot;namespace&quot;: &quot;mycompany&quot;\n}\n\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"dependency-rules\">Dependency Rules<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Package Type<\/th><th>Can Depend On<\/th><\/tr><\/thead><tbody><tr><td>Unlocked<\/td><td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_dependency_overview.htm\">Unlocked, Managed 1GP, Managed 2GP<\/a><\/td><\/tr><tr><td>Managed 2GP<\/td><td><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_dependency_overview.htm\">Managed 1GP, Managed 2GP (same namespace)<\/a><\/td><\/tr><tr><td>Managed 1GP<\/td><td>Managed 1GP only<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"avoiding-circular-dependencies\">Avoiding Circular Dependencies<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Design clear hierarchical layers<\/li>\n\n\n\n<li>Core\/utility packages at the bottom<\/li>\n\n\n\n<li>Application packages at the top<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_create_dependencies.htm\">Use interfaces to decouple<\/a> when needed<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"common-pitfalls-and-solutions\">Common Pitfalls and Solutions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pitfall-1-monolithic-package-syndrome\">Pitfall 1: Monolithic Package Syndrome<\/h3>\n\n\n\n<p><strong>Problem:<\/strong> Creating one large package with all metadata<\/p>\n\n\n\n<p><strong>Solution:<\/strong> <a href=\"https:\/\/trailhead.salesforce.com\/content\/learn\/modules\/unlocked-packages-for-customers\/break-up-your-metadata\">Break into smaller, focused packages<\/a> with clear responsibilities<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pitfall-2-ignoring-code-coverage\">Pitfall 2: Ignoring Code Coverage<\/h3>\n\n\n\n<p><strong>Problem:<\/strong> Failing to maintain 75% code coverage<\/p>\n\n\n\n<p><strong>Solution:<\/strong> <a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_code_coverage.htm\">Include tests in packages<\/a>, run coverage on every build<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pitfall-3-over-engineering-dependencies\">Pitfall 3: Over-Engineering Dependencies<\/h3>\n\n\n\n<p><strong>Problem:<\/strong> Creating too many small packages with complex dependency chains<\/p>\n\n\n\n<p><strong>Solution:<\/strong> <a href=\"https:\/\/developer.salesforce.com\/blogs\/2018\/06\/working-with-modular-development-and-unlocked-packages-part-1\">Balance modularity with practical maintainability<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pitfall-4-no-namespace-strategy\">Pitfall 4: No Namespace Strategy<\/h3>\n\n\n\n<p><strong>Problem:<\/strong> Conflicts when multiple teams develop independently<\/p>\n\n\n\n<p><strong>Solution:<\/strong> <a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_plan_namespaces.htm\">Use namespace for multi-team environments<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pitfall-5-skipping-scratch-org-testing\">Pitfall 5: Skipping Scratch Org Testing<\/h3>\n\n\n\n<p><strong>Problem:<\/strong> Packages work in sandboxes but fail in fresh orgs<\/p>\n\n\n\n<p><strong>Solution:<\/strong> <a href=\"https:\/\/trailhead.salesforce.com\/content\/learn\/modules\/unlocked-packages-for-customers\">Always validate packages in scratch orgs first<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"recommendations\">Recommendations<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"for-enterprise-internal-development\">For Enterprise Internal Development<\/h3>\n\n\n\n<p><strong>Primary Choice: Unlocked Packages<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Start with a <strong>core utilities package<\/strong> containing shared code<\/li>\n\n\n\n<li>Create <strong>functional packages<\/strong> for major business areas<\/li>\n\n\n\n<li>Use <a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_org_dependent.htm\"><strong>org-dependent packages<\/strong> for legacy transitions<\/a><\/li>\n\n\n\n<li>Implement <a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_plan_best_practices.htm\"><strong>CI\/CD<\/strong> with automated testing<\/a><\/li>\n\n\n\n<li>Consider <strong>namespace<\/strong> for large multi-team organizations<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"for-isvs-and-appexchange-partners\">For ISVs and AppExchange Partners<\/h3>\n\n\n\n<p><strong>Primary Choice: Managed 2GP<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Adopt <strong>source-driven development<\/strong> from the start<\/li>\n\n\n\n<li>Use <a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp_comparison.htm\"><strong>namespace sharing<\/strong> for modular products<\/a><\/li>\n\n\n\n<li>Leverage <strong>@namespaceAccessible<\/strong> for code sharing<\/li>\n\n\n\n<li>Plan for <a href=\"https:\/\/developer.salesforce.com\/blogs\/2023\/05\/move-to-managed-2gp-with-package-migrations\"><strong>Package Migrations<\/strong> if converting from 1GP<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_code_coverage.htm\">Maintain <strong>75% code coverage<\/strong> continuously<\/a><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"for-one-time-code-sharing\">For One-Time Code Sharing<\/h3>\n\n\n\n<p><strong>Primary Choice: Unmanaged Packages<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Use for <strong>templates and starter kits<\/strong><\/li>\n\n\n\n<li>Document clearly what customization is expected<\/li>\n\n\n\n<li>Consider providing as <strong>open-source<\/strong> on GitHub alongside<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"key-findings\">Key Findings<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.sfdx_dev.meta\/sfdx_dev\/sfdx_dev_unlocked_pkg_intro.htm\">Unlocked Packages are the recommended choice<\/a> for internal enterprise development<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg2_dev.meta\/pkg2_dev\/sfdx_dev_dev2gp.htm\">Managed 2GP packages are ideal for AppExchange distribution<\/a> with modern DevOps practices<\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/docs\/atlas.en-us.pkg1_dev.meta\/pkg1_dev\/packaging_developing_unmanaged.htm\">Unmanaged Packages are suitable only for one-time code transfers<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/developer.salesforce.com\/blogs\/2018\/06\/working-with-modular-development-and-unlocked-packages-part-1\">Modular architecture with package dependencies<\/a> enables scalable enterprise development<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<p><em>Have questions about Salesforce packaging options? Drop a comment below!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Deep dive into Salesforce packaging options including Unlocked Packages, Managed 2GP, Unmanaged Packages, and Org-Dependent Packages. Learn which package type fits your enterprise code distribution strategy.<\/p>\n","protected":false},"author":2,"featured_media":30410,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"jz_research_post":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[20,9],"tags":[574,575,509,576,573,572,505],"class_list":["post-30223","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apex","category-salesforce","tag-2gp","tag-ci-cd","tag-devops","tag-enterprise-development","tag-managed-packages","tag-salesforce-packages","tag-unlocked-packages"],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2025\/12\/Packaging-Blog-Post.png?fit=1600%2C637&ssl=1","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":7127,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/solve-for-common-errors-in-unlocked-packages\/","url_meta":{"origin":30223,"position":0},"title":"Solve for Common Errors in Unlocked Packages","author":"Jitendra","date":"June 29, 2020","format":false,"excerpt":"How to solve most frequent and common errors in unlocked packages","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":6951,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/mastering-visual-studio-and-salesforce-dx\/","url_meta":{"origin":30223,"position":1},"title":"Mastering Visual Studio and Salesforce DX","author":"Jitendra","date":"January 14, 2020","format":false,"excerpt":"3.5 hours of video to become Master on using and navigating Visual Studio, Need of scratch org and building modular application using Unlocked Packages","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Salesforce DX on Udemy","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/01\/Salesforce-DX-on-Udemy.png?fit=1200%2C693&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/01\/Salesforce-DX-on-Udemy.png?fit=1200%2C693&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/01\/Salesforce-DX-on-Udemy.png?fit=1200%2C693&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/01\/Salesforce-DX-on-Udemy.png?fit=1200%2C693&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/01\/Salesforce-DX-on-Udemy.png?fit=1200%2C693&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":6062,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/getting-started-with-salesforce-dx-salesforce-developer-experience\/","url_meta":{"origin":30223,"position":2},"title":"Most Frequently used SFDX Commands","author":"Jitendra","date":"May 25, 2017","format":false,"excerpt":"Introduction and basics of Salesforce Developer Experience (Salesforce DX) with source code and Video tutorials","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Salesforce Developer Experience - SFDX","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2017\/05\/sfdx.jpg-large.jpg?fit=1024%2C512&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":7817,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/automate-and-conquer-how-task-json-can-supercharge-your-salesforce-development\/","url_meta":{"origin":30223,"position":3},"title":"Automate and Conquer: How Task.json Can Supercharge Your Salesforce Development","author":"Jitendra","date":"June 1, 2023","format":false,"excerpt":"Discover the game-changing power of Task.json in Salesforce development with Visual Studio Code (VSCode) and Salesforce DX (SFDX). Streamline your workflow, automate tasks, and boost productivity as you dive into the world of Salesforce development. Explore how Task.json simplifies development with VSCode, accelerates SFDX deployments, and ensures consistency across your\u2026","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"SFDX + Task.json","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2023\/06\/SFDX-Task.json_.png?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2023\/06\/SFDX-Task.json_.png?fit=1200%2C675&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2023\/06\/SFDX-Task.json_.png?fit=1200%2C675&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2023\/06\/SFDX-Task.json_.png?fit=1200%2C675&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2023\/06\/SFDX-Task.json_.png?fit=1200%2C675&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":7183,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/breaking-5-myths-scratch-orgs-salesforce-dx\/","url_meta":{"origin":30223,"position":4},"title":"Breaking 5 Myths &#8211; Scratch Orgs &#038; Salesforce DX","author":"Jitendra","date":"December 6, 2020","format":false,"excerpt":"Its been around 3 years that Salesforce has released new tooling set for developers - Salesforce DX. I've been working on Salesforce since days of S-Control around 2008 and have seen extreme changes on platform for better. To be honest, it's tough to keep yourself up to date on latest\u2026","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Breaking 5 Myths - Scratch Orgs","src":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/12\/Breaking-5-Myths-Scratch-Orgs-e1624579030977.jpg?fit=700%2C495&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/12\/Breaking-5-Myths-Scratch-Orgs-e1624579030977.jpg?fit=700%2C495&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/12\/Breaking-5-Myths-Scratch-Orgs-e1624579030977.jpg?fit=700%2C495&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.jitendrazaa.com\/blog\/wp-content\/uploads\/2020\/12\/Breaking-5-Myths-Scratch-Orgs-e1624579030977.jpg?fit=700%2C495&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":1241,"url":"https:\/\/www.jitendrazaa.com\/blog\/salesforce\/step-by-step-salesforce-tutorial-creating-trigger-and-test-cases-6-of-6\/","url_meta":{"origin":30223,"position":5},"title":"Step by Step Salesforce Tutorial \u2013 Creating Trigger and Test cases \u2013 6 of 6","author":"Jitendra","date":"October 11, 2010","format":false,"excerpt":"Step by Step Salesforce Tutorial \u2013 Creating Trigger and test cases \u2013 6 of 6 tutorials series","rel":"","context":"In &quot;Salesforce&quot;","block_context":{"text":"Salesforce","link":"https:\/\/www.jitendrazaa.com\/blog\/category\/salesforce\/"},"img":{"alt_text":"Creating Trigger in Salesforce using force.com IDE","src":"https:\/\/i0.wp.com\/jitendrazaa.com\/blog\/wp-content\/uploads\/2010\/10\/Creating-Trigger-in-Salesforce-using-force.com-IDE.jpg?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts\/30223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/comments?post=30223"}],"version-history":[{"count":35,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts\/30223\/revisions"}],"predecessor-version":[{"id":30411,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/posts\/30223\/revisions\/30411"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/media\/30410"}],"wp:attachment":[{"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/media?parent=30223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/categories?post=30223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jitendrazaa.com\/blog\/wp-json\/wp\/v2\/tags?post=30223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}