Skip to content

Add software: custom App Store (VPP) apps #32461

@nonpunctual

Description

@nonpunctual

UPDATE: @noahtalerman: Interim solution is in the comment section here: #32461 (comment)

Goal

User story
As an IT admin,
I want to add a custom App Store (VPP) apps in Apple Business Manager and install this app on my Apple (iOS, iPadOS, and macOS) hosts via Fleet
so that I can deploy custom apps to my end users.

Roadmap item

None.

Original requests

None. This issue used to be the request. The original request is in the comment section here: #32461 (comment)

Resources

Changes

Product

Engineering

  • Test plan is finalized

  • Contributor API changes: None (existing API endpoints should work)

  • Feature guide changes: Update existing VPP guide

    Update /docs/Deploy/app-store-vpp-apps.md (or equivalent) to add:

  ## Custom App Store (VPP) Apps

  Fleet supports deploying custom apps you've added to Apple Business Manager.

  ### Prerequisites
  1. Develop and upload your app to App Store Connect
  2. Add the app to your ABM content location
  3. Purchase licenses for the app in ABM
  4. Connect your VPP token to Fleet

  ### Adding Custom Apps
  Custom apps appear automatically alongside public apps in:
  - Fleet UI: Software > Add software > App Store (VPP)
  - API: Same endpoints as public apps
  - GitOps: Same `app_store_apps` configuration

  ### Troubleshooting
  - **App not showing:** Verify licenses purchased in ABM for your location
  - **Install fails:** Ensure device is supervised and MDM-enrolled
  - **Wrong platform:** Custom apps appear for platforms specified in App Store Connect
  • Database schema migrations: None (existing table support custom VPP apps)

  • Load testing: Proxy capacity and Apple rate limits

    Concerns:

    1. Apple Enterprise API rate limits - Apple throttles requests per JWT. Single Fleet JWT serving all customers may hit limits under load.
    2. Proxy latency - Additional network hop through fleetdm.com adds ~50-200ms per request
    3. Proxy capacity - fleetdm.com must handle metadata requests from all Fleet Premium instances

Testing needed:

  • Simulate n (100+) Fleet instances refreshing VPP app lists concurrently
  • Measure Apple API rate limit behavior (429 responses)
  • Measure proxy throughput and latency under load
  • Verify caching strategy (if implemented) reduces Apple API calls

Mitigation strategies to evaluate:

  • Aggressive metadata caching (apps don't change frequently)

  • Request batching (combine adam_ids into fewer requests)

  • Multiple JWTs if rate limits are per-token

  • Load testing/osquery-perf improvements: None (doesn't affect osquery communication or host check-ins)

ℹ️  Please read this issue carefully and understand it. Pay special attention to UI wireframes, especially "dev notes".

QA

Risk assessment

  • Requires load testing: TODO
  • Risk level: Low / High TODO
  • Risk description: TODO

Test plan

Make sure to go through the list and consider all events that might be related to this story, so we catch edge cases earlier.

  • Connect a Fleet instance to customer-hawking's test VPP token
  • Add, edit, and delete customer-hawking's custom App in Fleet via the UI
  • Install customer-hawking`'s custom app on a macOS, iOS, and iPadOS host via Fleet
  • Add, edit, and delete customer-hawking's custom App to Fleet via Fleet's API
  • Add, edit, and delete customer-hawking's custom App to Fleet via GitOps
  • Verify that the new Apple API is used to fetch the version of already added VPP apps every hour. Add the Canva app for macOS and ensure that the version of the VPP app in Fleet matches what is installed on the host and what is available on the App Store.

Testing notes

Confirmation

  1. Engineer: Added comment to user story confirming successful completion of test plan.
  2. QA: Added comment to user story confirming successful completion of test plan.

Sub-issues

Metadata

Metadata

Labels

#g-softwareSoftware product group:productProduct Design department (shows up on 🦢 Drafting board)customer-hawkingprospect-distratisstoryA user story defining an entire feature~csaIssue was created by or deemed important by the Customer Solutions Architect.~customer promiseA feature request, or user story for a request, that Fleet has contractually agreed to deliver

Type

No type

Projects

Status

✅ 🎉 Confirm and celebrate

Status

No status

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions