SUBJECT
eMenu Pro Plus (Apple ID 6476978160) - version 36.3 is not served to iOS 12 devices via Apple Business Manager / MDM; the store returns an empty asset with no fallback to the previous compatible version
1. SUMMARY
Since we released eMenu Pro Plus For Restaurants 36.3, the app can no longer be installed on our iOS 12 iPads through Apple Business Manager device-assigned licences deployed by our MDM.
The device requests the app, the store returns an HTTP 200 success, but the response contains no asset metadata at all - no bundleID, no softwareVersionExternalIdentifier, no download URL. The install is therefore queued and then stalls permanently in the "Installing" state; nothing is ever downloaded.
Critically, the store does not fall back to the previous compatible version (36.1.3) - it returns nothing. Our two other apps assigned to the same device in the same MDM session resolve and install normally, so this is specific to this one Apple ID, not to the device, the VPP token, the account, or the storefront.
We would like to understand (a) what makes 36.3 ineligible on these devices, and (b) how to get 36.1.3 delivered to them in the meantime.
2. ENVIRONMENT AND IDENTIFIERS
App: eMenu Pro Plus For Restaurants
Apple ID (adamID): 6476978160
Bundle ID: com.conceptic.eMenuPlus
Current version: 36.3 (build 20260901), external version ID 890653216
Previous version: 36.1.3 - still present in App Store Connect, not removed from sale
Declared minimum OS: iOS 12.0 (IPHONEOS_DEPLOYMENT_TARGET = 12.0), iPad-only (TARGETED_DEVICE_FAMILY = 2)
Distribution: Apple Business Manager, device-assigned (device licence) VPP, pushed by our own MDM
3. SYMPTOM
On the affected iOS 12 device, the MDM InstallApplication command for Apple ID 6476978160 is accepted, the app shows as "Installing", and it never completes. No download begins, and no error is surfaced to the user or reported back to the MDM.
4. EVIDENCE
4.1 Affected device - the store returns an empty asset
Unified log, appstored, 3 September 2026, times in UTC+7:
17:52:14.334955 appstored [ManagedApplicationOperation]: Preflight complete app with bundleID: com.conceptic.eMenuPlus itemID: 6476978160 free: 1 owned: 0
17:52:14.632155 appstored StoreURLOperation: Received 200 response: .../MZFinance.woa/wa/volumeStoreDownloadProduct
17:52:14.637141 appstored [ManagedApplicationOperation]: No app to attempt an inline update of app with itemID: 6476978160
17:52:14.637229 appstored [ManagedApplicationOperation]: Install itemID: 6476978160 with metatdata: { } with bundleDisplayName: (null)
17:52:14.922161 appstored [ManagedApplicationOperation]: Installing vpp application with itemID: 6476978160 evid: (null)
17:52:14.927694 dmd Set state: Installing, for bundle identifier: com.conceptic.eMenuPlus volumeStoreDownloadProduct answers 200 with an empty metadata dictionary and bundleDisplayName: (null). There is no softwareVersionExternalIdentifier and no evid, so installd is never asked to install anything and the state never leaves "Installing".
4.2 Same device, same session - the other two apps resolve correctly
17:51:53.142472 appstored [ManagedApplicationOperation]: Install itemID: 911323177 with
metatdata: {
bundleDisplayName = "eMenu wine list";
bundleID = "com.conceptic.eMenuWine";
is32bitOnly = 0;
softwareVersionExternalIdentifier = 852152575;
uncompressedSize = 31519744;
} with bundleDisplayName: eMenu wine list
...
eMenu Wine (911323177) and eMenu Pro (483325367) are assigned from the same ABM organisation, over the same VPP token, in the same 60-second window, and both return a full asset and install. Only 6476978160 comes back empty.
4.3 Reference device (iPad 5th generation) - the same assignment succeeds
23:12:07.356426 appstored bundleDisplayName: eMenu Pro Plus For
Restaurants metatdata: {
bundleID = "com.conceptic.eMenuPlus";
softwareVersionExternalIdentifier = 890653216;
}
23:12:16.675301 appstored Evaluating download, size = 23.2 MiB
4.4 The two OS versions use different Apple backend services
The endpoints used by the two devices are completely disjoint.
The affected device (iOS 12.5.8) contacts only:
p23-buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/volumeStoreDownloadProduct
mzstorekit.itunes.apple.com/inApps/v1/receipts/renewVppReceipt
It makes no request to amp-api.apps.apple.com, downloaddispatch.itunes.apple.com, or the iosapps.itunes.apple.com asset CDN.
The reference device (iPadOS 16.7.15) contacts only:
amp-api.apps.apple.com/v1/catalog/th/apps/6476978160?l=en&platform=ipad
downloaddispatch.itunes.apple.com/ent/download
iosapps.itunes.apple.com/itunes-assets/... (asset CDN)
mzstorekit.itunes.apple.com/inApps/v1/receipts/renewVppReceipt
It never calls volumeStoreDownloadProduct or any other MZFinance endpoint.
So the affected device performs a single legacy MZFinance call and receives the empty asset shown in 4.1, while the reference device performs a catalog lookup for the same Apple ID, then a signed download dispatch, and then downloads the package.
5. QUESTIONS
What makes 36.3 ineligible on iOS 12.5.8? Please confirm whether external version ID 890653216 of Apple ID 6476978160 is flagged incompatible with iOS 12.x, and which attribute drives that - the binary's MinimumOSVersion, the SDK it was built against, UIRequiredDeviceCapabilities, the architecture slices, or the available app-thinned variants. We declare IPHONEOS_DEPLOYMENT_TARGET = 12.0 and expect the app to remain installable on iOS 12. We would also like to know whether a variant the legacy service can serve exists at all for this version.
Why an empty asset instead of a fallback to 36.1.3? Our logs show iOS 12.5.8 resolving apps exclusively through the legacy MZFinance volumeStoreDownloadProduct service, while newer iPadOS uses amp-api.apps.apple.com and downloaddispatch.itunes.apple.com and never calls MZFinance (see 4.4). Is version selection - including the last-compatible-version fallback - implemented on the legacy path, or only on the modern AMS path? And is that fallback supported at all for device-assigned (device licence) VPP installs initiated by MDM, as opposed to user-initiated App Store downloads? We could not find this documented either way. Returning HTTP 200 with an empty dictionary and no error also leaves the MDM with nothing to report, which we would ask you to treat as a defect regardless of the compatibility outcome.