Package your Commerce App into a CAP (Commerce App Package) for distribution.
CAP Structure Requirements
Your packaged Commerce App must conform to the CAP structure defined in Architecture Overview. The ZIP must contain a single root directory named commerce-{app-name}-app-v{version}/ and contain only the recognized subdirectories.
app-configuration/tasksList.json defining the setup wizard
icons/ directory with at least one icon file named {isv-name}.{ext} (PNG, SVG, JPG, or JPEG)
At least one of: cartridges/ (back-end logic), storefront-next/ (frontend extensions), or impex/ (configuration data)
Optional Files
app-configuration/adminComponents.json — declares Business Manager admin UI components shown to merchants after install. Use this to ship storefrontComponentVisibility toggles that let merchants enable or disable individual UI targets. See adminComponents.json Schema for the field reference and a complete example.
app-configuration/translations/<locale>.json — localized strings for tasksList.json and (when shipped) adminComponents.json. See App-shipped string localization.
The tasksList.json
This file defines the post-install configuration steps that appear in the Business Manager setup wizard. Each task has a stable taskKey, a task number, name, description, a deep link to the relevant BM page, and an initial status. The taskKey must be a unique snake_case identifier (matching ^[a-z][a-z0-9_]*$); locale files reference it to translate the name and description fields. See App-shipped string localization.
Example:
1[2{3 "taskKey": "enable_tax_service",4 "taskNumber": 1,5 "name": "Enable Tax Service",6 "description": "Navigate to Site Preferences and enable the tax calculation service",7 "link": "/on/demandware.store/Sites-Site/default/ViewApplication-BM?..."8},9{10 "taskKey": "configure_api_credentials",11 "taskNumber": 2,12 "name": "Configure API Credentials",13 "description": "Enter your account ID and license key in site preferences",14 "link": "/on/demandware.store/Sites-Site/default/ViewApplication-BM?..."15}16]
Localizing app-shipped strings
To render tasksList.json and adminComponents.json strings in additional locales, ship locale files under app-configuration/translations/. Each locale file uses two reserved top-level namespaces — tasks (keyed by taskKey) and adminComponents (keyed by componentKey) — and Business Manager falls back to literal English when no translation is shipped. en-US.json is required if the directory exists. See App-shipped string localization for the full schema, supported locales, fallback chain, and CI validation rules.
IMPEX Structure
The impex/ directory contains site-scoped XML organized into install/ and uninstall/ subdirectories. The install/ directory is processed during app installation; the uninstall/ directory during removal.
Within install/, use standard Commerce Cloud IMPEX conventions:
jobs.xml for job definitions
services.xml for service credentials, profiles, and definitions
meta/system-objecttype-extensions.xml for system object attribute extensions
meta/custom-objecttype-definitions.xml for custom object type definitions
sites/SITEID/preferences.xml for site preferences
Placeholder Replacement
The install job automatically replaces SITEID and LIBRARYID placeholders in both file paths and file content during processing. Placeholder replacement applies to the following text file types: .xml, .csv, .txt, .json, .properties, .js. Binary files are copied as-is without replacement.
Use SITEID in directory paths (for example, sites/SITEID/preferences.xml) and inside XML content for site-scoped data.
Use LIBRARYID for content library references. The library ID is resolved from the target site’s content library at install time.
Install IMPEX files are processed via Site Import in merge mode, meaning they add or update data without deleting existing resources. Use placeholder credentials in service definitions — merchants configure real credentials during the post-install setup tasks.
Important: Use dotted notation for service IDs (for example, myapp.api) and camelCase with an app prefix for attribute IDs (for example, myAppEnabled). Don’t hardcode production credentials.
Uninstall IMPEX
The impex/uninstall/ directory contains XML files that clean up resources when the app is removed. Use mode="delete" in uninstall IMPEX files to remove services, profiles, and credentials.
During installation, the platform serializes the contents of impex/uninstall/ and persists them in the CommerceFeatureState record. At uninstall time, the platform reconstructs these files from persisted state — the original CAP archive isn’t needed for uninstall.
Deletion order matters: Delete in this order to respect foreign key relationships: service → profile → credential.
Note: Uninstall IMPEX only runs when the last site uninstalls the app, because services and custom object definitions are instance-scoped resources shared across all sites. See Multi-Site Behavior for details.
Compute the SHA256 hash and verify it matches the manifest:
1shasum -a 256 my-app-v1.0.0.zip
Test the packaged .zip on a sandbox before submitting to the registry.
Open a pull request against the appropriate release branch in the App Registry (for example, release/26.8 or release/26.9). Do not target main — submissions must target a release branch.