> ## Documentation Index
> Fetch the complete documentation index at: https://developer.jtl-software.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Share a Private App

> Create a private listing and share your app with selected merchants using activation codes.

A private app isn't listed in the App Store. You share it with selected merchants using activation codes. This suits an app that isn't ready for general release, or one built for a few specific customers.

## Before You Start

Your app needs to be registered, provisioned, and tested, and you need to [Become a Seller](https://www.jtl-software.de/extension-store/Seller-werden) to list it.

Deploy your app to a public URL with HTTPS and update its URLs to production in the app manifest before you submit.

## Activation Codes

Merchants install a private app with an activation code you generate in [JTL Hub](https://hub.jtl-cloud.com/). Each code is single-use: one code activates the app for one merchant.

As a seller, you can generate as many codes as you need. Without a listing, you're limited to three.

## The Listing Manifest

You define your listing in a manifest. Set `distributionType` to `PRIVATE` to keep it out of the App Store.

```json theme={null}
{
  "version": "1.0.0",
  "defaultLocale": "de-DE",
  "distributionType": "PRIVATE",
  "name": {
    "de-DE": {
      "short": "My App",
      "full": "My JTL Cloud App"
    }
  },
  "description": {
    "de-DE": {
      "short": "A short teaser.",
      "full": "The full description of the app."
    }
  },
  "benefits": {
    "de-DE": [
      "Benefit 1",
      "Benefit 2",
      "Benefit 3"
    ]
  },
  "category": {
    "main": "articles-product-data",
    "sub": ["item-master-data-attributes"]
  },
  "media": {
    "icons": {
      "light": "https://example.com/icon-light.png",
      "dark": "https://example.com/icon-dark.png"
    },
    "screenshots": [
      {
        "id": "screenshot-1",
        "url": "https://example.com/screenshot-1.png",
        "alt": "The app's dashboard"
      }
    ]
  },
  "compatibility": {
    "products": {
      "de-DE": ["jtl-wawi"]
    },
    "productsNotes": "",
    "minVersions": {
      "jtl-wawi": "1.1.0"
    }
  },
  "support": {
    "url": {
      "de-DE": "https://example.com/support"
    },
    "documentation": {
      "de-DE": "https://example.com/docs"
    }
  },
  "legal": {
    "privacyPolicy": "https://example.com/privacy",
    "termsOfUse": "https://example.com/terms",
    "gdpr": {
      "request": "https://example.com/gdpr/request",
      "delete": "https://example.com/gdpr/delete"
    }
  }
}
```

Private listings don't go through App Store review.

<Info>
  You can configure your pricing tiers now, but merchant billing through them is not yet available. Defining your tiers now ensures your listing is ready when billing becomes available.
</Info>

Before you submit, replace any development placeholders with production content:

* **Icons and screenshots**: Replace placeholder URLs with your production assets hosted at stable, publicly accessible URLs. Provide both light and dark icon variants.
* **Names and descriptions**: Finalize the copy for every locale you support (`name.{locale}.short`, `name.{locale}.full`, `description.{locale}.short`, `description.{locale}.full`).
* **Benefits**: Provide three to five localized benefits describing the value your app offers merchants.
* **Compatibility**: List the supported JTL products and specify a valid minVersions entry for each.
* **Support URLs**: Set `support.url.{locale}` and `support.documentation.{locale}` to publicly accessible support and documentation pages.
* **Legal URLs**: Ensure `legal.privacyPolicy`, `legal.termsOfUse`, `legal.gdpr.request`, and `legal.gdpr.delete` all point to published pages. These are required for JTL compliance.

Names, descriptions, benefits, supported products, and support URLs are localized by locale, allowing a single manifest to support multiple markets.

See the [Listing Manifest Reference](/guides/cloud-apps/listing-manifest) for more details.

## Create the Listing

Create your listing as a draft. All three paths produce the same listing.

<Tabs>
  <Tab title="CLI">
    If you're using one of the JTL Cloud App starter templates, update the `listing.json` file in your project root, then create the listing draft:

    ```bash theme={null}
    npm run listing
    ```

    If you're building your app from scratch:

    1. Create a `listing.json` file in your project root
    2. Generate the listing draft:

    ```bash theme={null}
    npx -y @jtl-software/create-cloud-app@latest listing
    ```

    The CLI reads your `listing.json` and creates a listing in the **DRAFT** state in the Partner Portal.

    Once the listing is created, use the returned URL to open the listing in the [Partner Portal](https://partner.jtl-cloud.com/) to review and submit it.
  </Tab>

  <Tab title="Listing Wizard">
    In the [Partner Portal](https://partner.jtl-cloud.com/), navigate to **Publish apps** and select **Edit listing** for your app.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/listing_private_menu.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=9e54725ea21a5083d1e4dd20690eca44" alt="General Step in Listing" width="2718" height="1454" data-path="images/listing_private_menu.png" />

    The Listing Wizard guides you through five steps:

    1. Generally
    2. Media
    3. Compatibility
    4. Prices
    5. Legal

    You can save your progress at any time. Your listing remains in the **DRAFT** state until you submit it for review.

    #### 1. Generally

    Configure the basic information for your app.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/listing_menus.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=dcd04ec5e60e1682a8a1505dcf6ecd60" alt="General Step in Listing" width="2698" height="1482" data-path="images/listing_menus.png" />

    For the distribution type, choose **Private**. This makes your app eligible for publication in the App Store after it passes JTL's review.

    Then fill in other required details and click **Further** to continue.

    #### 2. Media

    Choose your app category and upload your marketing assets.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/listing_media_steps.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=cd086ae00c40b61956b5eea5bf70bc1a" alt="Media Step in Listing" width="2676" height="1424" data-path="images/listing_media_steps.png" />

    Provide:

    * A primary category and at least one subcategory
    * Light and dark app icons (JPG, PNG, or SVG, 250 × 250 px)
    * At least one screenshot or product image (up to 5 MB each)
    * An optional YouTube product video

    #### 3. Compatibility

    Choose which JTL products your app supports.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/listing_compatibility_steps.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=e65db192cc7deec592a0feb165625375" alt="Compatibility Step in Listing" width="2714" height="1260" data-path="images/listing_compatibility_steps.png" />

    You can select:

    * JTL-Wawi
    * JTL-Shop
    * JTL-WMS
    * JTL-POS
    * JTL-FFN

    Use Further information to describe additional supported products or third-party integrations.

    <Note> JTL-WMS and JTL-POS require JTL-Wawi. Selecting either product automatically selects JTL-Wawi. </Note>

    #### 4. Prices

    Every public listing must include at least one package. You can create up to four packages, each marked as Free or Paid.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/listing_prices_steps.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=9cc92663ad90bd0b5877c827a2f4b840" alt="Pricing Step in Listing" width="2810" height="1280" data-path="images/listing_prices_steps.png" />

    <Info> Although pricing can be configured now, merchant billing isn't fully available yet. Configure your packages so your listing is ready once billing becomes available. </Info>

    For each package, provide the required details and note that a listing can have only one free package, and only one package marked **Most Popular**.

    #### 5. Legal

    Provide the required legal and support information. All URLs must be valid and publicly accessible.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/listing_legal_steps.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=8ca46a8b605d6a351ba58cdf54974dd9" alt="Legal Step in Listing" width="2778" height="1344" data-path="images/listing_legal_steps.png" />

    After completing the final step, you can save as draft or submit the listing for review.
  </Tab>
</Tabs>

## Submit your Listing

Submit your listing when it's complete.

Because private apps skip App Store review, your listing is ready to share once submitted.

## Generate and Share Activation Code

Generate an activation code for your app in [Partner Portal](https://partner.jtl-cloud.com/) under **Manage apps**.

Send the code to your customer directly, for example by email, along with instructions for redeeming it. A private app you build under your own tenant isn't visible in another merchant's tenant, so the code is what gives them access to install it.

<Steps>
  <Step title="Open the Partner Portal">
    Go to [Partner Portal](https://partner.jtl-cloud.com/) and open **Manage apps**. In the app list, click the three-dot menu for your app and select **Activation codes**.
  </Step>

  <Step title="Generate a code for your app">
    Generate an activation code by clicking on the **Create activation code** button.

    A dialog will show where you can manually input your custom activation code or auto-generate one by clicking the dice icon.
    The code is a plain-text string tied to your private app.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/create_activation_code.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=ffb27d3312e926894d60450128f1ce88" alt="Activation code dialog for a private app" width="2748" height="1262" data-path="images/create_activation_code.png" />
  </Step>
</Steps>

### How a Merchant Redeems a Code

Include these steps when you send the code:

<Steps>
  <Step title="Open Manage apps menu in JTL Hub">
    In [JTL Hub](https://hub.jtl-cloud.com/), open **Manage apps**.
  </Step>

  <Step title="Start activation">
    At the bottom of the page, click the **Activate now** button. A dialog opens.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/activation_code.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=f737a98d468dd59ddb6b0573e5422b5a" alt="Activation dialog in JTL Hub" width="2790" height="1386" data-path="images/activation_code.png" />
  </Step>

  <Step title="Enter the code">
    Enter the activation code you received from your partner and follow the prompts to install the app.

    <img src="https://mintcdn.com/jtlsoftwaregmbh/-AbsNEVLtF04W-9_/images/enter_activation_code.png?fit=max&auto=format&n=-AbsNEVLtF04W-9_&q=85&s=05e8738f3a5b3e839eccd2b0c8ea8c46" alt="Activation dialog in JTL Hub" width="2804" height="1250" data-path="images/enter_activation_code.png" />
  </Step>
</Steps>

Once the merchant redeems the code, the app installs in their tenant and runs through the same setup flow as any other app.

## What's Next?

<CardGroup cols={2}>
  <Card title="Publish to the App Store" icon="store" href="/get-started/submitting-your-app/publish-to-app-store">
    Ready for a wider audience? Publish your app for all merchants to find and install.
  </Card>

  <Card title="App Shell & UI" icon="app-window" href="/guides/cloud-apps/app-shell-ui-integration">
    Add panel views, custom tabs, and deeper ERP integration to your app.
  </Card>
</CardGroup>
