Watch app cannot be downloaded on device. Device is listed as compatible in manifest and on the website, but not in the mobile app.

I keep getting emails from people saying they can't install my app on the Tactix 8. Everything on my end looks correct. On the Website, it lists the tactix 8 as compatible, but not in the connect iq mobile app. My manifeset has the lowest minimum api possible (1.2.0) and has all the appropiate devices ticked. (Looks good in the xml, but I wont copy the entire thing here unless requested). Furthermore, people are able to download it on the fenix 8, which I assumed would be in the same boat as the tactix 8. Anyone have any ideas or suggestions? Thanks.

App URL: https://apps.garmin.com/apps/aa34e9ae-7ad1-44fd-a391-55439615d8fe?tid=1

Screenshot from website:

Screenshot from mobile app:

manifest:

  • Soooo, I can actually see that your app indeed may not support Tactix 8 (AMOLED or Solar).

    First of all, app support for Garmin devices [*] is determined by part number, not Connect IQ device ID. More on this below.

    [*] Here I mean "device" in the generic sense (like how the user would think of it), not a Connect IQ device ID / definition such as fr965 or fenix7x that you select in the manifest. A single CIQ device like fenix7x can have multiple part numbers and/or refer to multiple real-life customer-facing models (e.g. the fenix7x CIQ device includes both Fenix 7X and Enduro 2)

    Anyway, it looks like:

    - The store says that certain part numbers which correspond to a couple of Fenix 8 models [47/51mm AMOLED and 51mm Solar] also apply to the corresponding Tactix 8 models. 

    These part numbers are 006-B4536-00 and 006-B4533-00, and they're supported by your app. I don't think these part numbers are used by real Tactix 8 devices though

    - There are also a couple of part numbers which only correspond to Tactix 8 [47/51mm AMOLED and 51mm Solar]

    These new part numbers are 006-B4775-00 and 006-B4776-00, and they're not supported by your app. I think these are the real Tactix 8 part numbers

    If I'm right, the solution is to:

    - update your devices in the SDK manager

    - rebuild (export) your app

    - upload it to the store

    I more or less confirmed the viability of this solution by exporting a test project for fenix847mm and fenix8solar51mm.

    It contains all 4 part numbers above, including the new part numbers for Tactix 8 AMOLED and Solar which aren't supported by your app (as the investigation below confirms).

    I opened a bug report here:

    forums.garmin.com/.../connect-iq-store-website-falsely-claims-that-fenix-8-compatible-app-also-supports-tactix-8-app-was-last-updated-before-tactix-8-released

    -- 

    NOTE: Tactix 8 was only released in February 2025. [The app was last updated in January 2025]

    So Tactix 8 didn't even exist back when your app was last updated. Obviously those new part numbers (whose existence is confirmed below) could not be supported by your app since they did not exist at that time either.

    The only question is why the store website both:

    - describes the old Fenix 8 part numbers as corresponding to both Fenix 8 and Tactix 8. (It's notable that Connect IQ store app doesn't do this - in fact it never lumps different models together in the way that the website does)

    - also has descriptions for the new Tactix 8 part numbers [as you will see below]

    They can't both be right, unless there was a change at some point. But if there was, Garmin should've made it seamless for app devs. And the store website shouldn't say that an app is compatible with Tactix 8 when it's not.

    --

    This will be a very long post, but everything else below is background info, plus an explanation of how you can find out about part number mappings and app metadata yourself.

    Sorry it's super-long and badly edited. I originally had a bad assumption (that Tactix 8 was actually released when you last updated your app, but ofc it wasn't)

    [1/x]

  • To see why, we have to look into a few things that Garmin doesn't tell us about.

    First off, we need to look at the device configuration files that are installed alongside the SDKs on your dev computer, by the SDK manager. Device config files are continuously updated by Garmin, and the latest version of the set is delivered by the SDK manager. (Unlike the SDKs, you can't use the SDK manager to get an older version of the device config files.)

    1) Open the ConnectIQ folder which is the parent of SDKs\CURRENT_SDK:

    In VS code, open the command palette and select "Monkey C: Open Sample Folder". This opens a folder with a path like "...\ConnectIQ\SDKs\CURRENT_SDK. Navigate to the up 2 level so that you're at ...\ConnectIQ.

    The path for "...\ConnectIQ" is:

    - Windows: %APPDATA%\Garmin\ConnectIQ

    - Mac: $HOME/Library/Application Support/Garmin/ConnectIQ/

    - Linux: $HOME/.Garmin/ConnectIQ

    This can be seen here: https://developer.garmin.com/connect-iq/reference-guides/monkey-c-command-line-setup/

    2) Navigate to ...\ConnectIQ\Devices

    This folder contains device folders: one for every Connect IQ device, named after the device itself  - specifically, the device ID that you see in manifest.xml (e.g. "fenix7").

    Each device folder has relevant information about the corresponding device, especially in files called compiler.json and simulator.json.

    [2/x]

  • 3) Each CIQ device => single hardware part number

    Each Connect IQ device (e.g. fenix7) corresponds to a hardware part number.

    This can be seen in DEVICE_ID\compiler.json, which has a hardwarePartNumber key (e.g. "010-02540-20" for fenix7).

    4) Each CIQ device => one or more (software) part numbers (software variants)

    (Usually when we talk about "part numbers" in the context of CIQ , we mean software part numbers. The hardwarePartNumber is rarely mentioned.)

    A single CIQ device / hardware part number can have multiple software part numbers. For example, fenix7/compiler.json has a partNumber array with 2 part numbers: "006-B3906-00" and "006-B3909-00".

    These software part numbers represent software variants of a given hardware part number.

    - One type of of software variant is regional (WW vs APAC):

    Especially for older models (like Fenix 7 and older), the same hardware would have different firmware for WW (worldwide) and APAC (Asia-Pacific) regions. This was done because storage space was at a premium, so Garmin would put English and European languages/fonts on the WW models, but English and Asian languages/fonts on the APAC models.

    - Another type of software variant relates to different (customer-facing) models which have the same hardware part number. (Ofc they may have physical differences, like having a different case, but the hardware is essentially the same)

    For example, as you surmised, Fenix 8 and Tactix 8 are basically the same hardware. Similarly, Enduro 2 is basically a Fenix 7X with a big battery.

    Another example is regular Venu versus Mercedes-Benz Venu

    These "variant models" don't always have different software part numbers, but sometimes they do. 

    [3/x]

  • 5) (Software) part numbers are the real targets of the CIQ export process

    Software part numbers are important because the Connect IQ export process ("Monkey C: Export Project") doesn't actually build for CIQ devices (as seen in the manifest), it builds for software part numbers. That's why the build output mentions that you are building for so many more "devices" than actually exist in the manifest. Because when it says "devices", it means part numbers.

    When you export a project, the compiler build for part numbers associated with the given CIQ devices you selected in manifest.xml, but it's not guaranteed that all part numbers will be included (read on).

    NOTE: you can skip to 8) below as 6) and 7) aren't relevant to your situation

    6) (Software) part numbers can be excluded by the CIQ export process based on API level / firmware and language

    You may have also seen warnings in the export process about certain "part numbers" not being included in the export.

    This can happen:

    6a) if your minimum API level in manifest.xml is set higher than the connectIQVersion in the corresponding partNumber entry in compiler.json

    6b) if you explicitly set languages in manifest.xml, and you select languages supported by one part number and not another

    6a happened all the time with the old WW vs APAC split. For whatever reason, APAC firmware updates always lagged behind WW firmware updates, sometimes permanently. This means that the CIQ version supported by the APAC part number(s) for a device might be lower than the WW part number(s) for the same device. So if a dev set minApiLevel too high, APAC models could be excluded while WW models might still be included. 

    This led to many dev and users complaints about some app not being available for APAC models.

    6b happened at least once when a dev explicitly set Asian languages in the manifest but not English - they relied on the fallback behaviour for the "default" language to handle English. But this resulted in their app not being available for WW models.

    [4/x]

  • 7) (Software) part numbers can be excluded by the store at install time [due to too-low firmware/CIQ version]

    In compiler.json > partNumbers, each part number definition has a connectIQVersion value, as mentioned before. There's also a corresponding firmwareVersion value. The represents the firmware which goes along with the CIQ version.

    These versions aren't necessarily the latest versions available for a given part number, but they are the minimum required versions to install your app.

    For example, right now both part numbers for the fenix7 device - "fēnix 7 / quatix 7" -have connectIQVersion = "5.1.0" and firmwareVersion = "2016".

    Users of these models need to have at least firmware 20.16 to install an app that was built against the current device configuration. In turn, this firmware version guarantees a minimum Connect IQ version of 5.1.0, although that doesn't seem to be explicitly checked by the store.

    [5/x]

  • How does all of this relate to your app?

    If I look at the metadata for your app, and the mapping of part numbers to actual models, I can see that your app does *not* support certain part numbers related to Tactix 8.

    8) CIQ app metadata and mapping of part numbers to models

    Open your app in the CIQ store website:

    [https://apps.garmin.com/apps/aa34e9ae-7ad1-44fd-a391-55439615d8fe]

    Open the network tab and reload the page.

    There are 2 requests of interest:

    8a) Mapping of part numbers to models (not specific to your app)

    [https://apps.garmin.com/api/appsLibraryExternalServices/api/asw/deviceTypes]

    This returns a JSON array of part numbers with information about each one.

    We can see there are 4 part numbers related to Tactix 8 (according to this endpoint, anyway)

    ...
    {
        "id": "308",
        "partNumber": "006-B4536-00",
        "name": "fēnix® 8 AMOLED (47mm/51mm)",
        "additionalNames": ["quatix® 8 AMOLED (47mm/51mm)", "tactix® 8 AMOLED (47mm/51mm)"],
        "imageUrl": "https://res.garmin.com/en/products/010-02905-00/v/pd-06-sm.jpg",
        "urlName": "fenix8-51mm"
    },
    ...
    {
        "id": "311",
        "partNumber": "006-B4533-00",
        "name": "fēnix® 8 Solar (51mm)",
        "additionalNames": ["fēnix® 8 Dual Power (51mm)", "tactix® 8 Solar (51mm)"],
        "imageUrl": "https://res.garmin.com/en/products/010-02907-10/v/rf-sm.jpg",
        "urlName": "fenix8s-51mm"
    },
    ...
    {
        "id": "324",
        "partNumber": "006-B4775-00",
        "name": "tactix® 8 – 47 mm, AMOLED",
        "additionalNames": ["tactix® 8 – 51 mm", "AMOLED"],
        "imageUrl": "https://res.garmin.com/en/products/010-03405-00/v/pd-07-sm.jpg",
        "urlName": "tactix8-47-51"
    },
    ...
    {
        "id": "335",
        "partNumber": "006-B4776-00",
        "name": "tactix® 8 – 51 mm, Solar",
        "additionalNames": ["tactix® 8 – 51 mm", "Solar", "Elite"],
        "imageUrl": "https://res.garmin.com/en/products/010-03407-00/v/pd-08-sm.jpg",
        "urlName": "tactix8s-51"
    }

    [6/x]

  • 8a) continued

    This is actually super interesting because there seem to be duplicates [*], and they don't seem to represent WW vs Asia variants, otherwise that would be reflected in the data somehow, like a urlName with "asia" or "apac" in it.

    [*] more precisely, overlapping mappings, where 2 older part numbers map to Fenix 8 and Tactix 8, but 2 newer part numbers only map to Tactix 8

    [see next comment for breakdown of part numbers]

    We can also see that fenix847mm/compiler.json lists both 006-B4536-00 (Fenix 8 / Tactix 8 - AMOLED) and 006-B4775-00 (Tactix 8 AMOLED), and they support the same languages

    Similarly, fenix8solar51mm/compiler.json lists both 006-B4533-00 (Fenix 8 / Tactix 8 - Solar) and 006-B4776-00 (Tactix 8 Solar), and they support the same languages

    My guess is that B4775 and B4776 are the actual part numbers for Tactix 8

    8b) App-specific metadata

    [https://apps.garmin.com/api/appsLibraryExternalServices/api/asw/apps/aa34e9ae-7ad1-44fd-a391-55439615d8fe]

    This is a JSON object, which contains, among other things, a compatibleDevicePartNumbers[] array.

    Notice that compatibleDevicePartNumbers[]  contains B4536 and B4533, but not B4775 or B4776 .

    ------

    As noted in an edit to the 1st comment, Tactix 8 and the new part numbers (B4775/B4776) did not even exist in January 2025 when your app was last updated.

    So the likely explanation for your problem is that B4775/B4776 are the real part numbers for Tactix 8 [*], and it's no surprise that your app won't install on a Tactix 8 because it wasn't built with support for those new part numbers.

    [*] by "Tactix 8" I mean a physical device called "Tactix 8", not a CIQ device ID

    The real mystery is why the deviceTypes API (used by the store website's Compatible Devices tab) insists on describing the old part numbers [formerly just for Fenix 8] as also referring to "Tactix 8".

    I'm not sure if it's just a simple bug or if there's more to the story, like maybe those part numbers were originally planned to be used for Tactix 8, maybe they were used for Tactix 8 at one point but later on Tactix 8 got its own part numbers, or whether it's part of a half-baked backwards compatibility scheme.

    [7/x]

  • Breakdown of part number mappings:

    (old) 006-B4536-00: "fēnix® 8 AMOLED (47mm/51mm)", "quatix® 8 AMOLED (47mm/51mm)", "tactix® 8 AMOLED (47mm/51mm)"

    (new) 006-B4775-00: "tactix® 8 – 47 mm, AMOLED", "tactix® 8 – 51 mm", "AMOLED"

    --

    (old) 006-B4533-00: "fēnix® 8 Solar (51mm)", "fēnix® 8 Dual Power (51mm)", "tactix® 8 Solar (51mm)"

    (new) 006-B4776-00: "tactix® 8 – 51 mm, Solar", "tactix® 8 – 51 mm", "Solar", "Elite"

    [8/8]

  • I will say that Garmin has broken CIQ builds in the past by changing part numbers. I'm not saying I'm sure that's what happened here, but there is historical precedent

    Last year they removed the Enduro 2-specific part number from the fenix7x device, which meant nobody could build for Enduro 2.

    When Garmin was notified of this, it took weeks to respond. They finally said "it's ok, the real Enduro 2 will be changed so it has the same part number as the actual Fenix 7X (base part number for fenix7x device)"

    But a couple of months passed and still nobody could build for Enduro 2.

    When Garmin was pinged they said that the firmware team never actually changed the part number but they would make sure it got changed.

    Then it was pointed out to them that the part number mapping in deviceTypes didn't change. Enduro 2 still had its own part number (and of course, its own device image.) Shouldn't the part number mapping have to be updated as well? Otherwise there would be no way to tell users that Enduro 2 is supported.

    At this point, Garmin decided to revert the change to fenix7x/compiler.json to restore the Enduro 2-specific part number. Even though the real part number would change, they would keep the old part number in the device config file so that the store could display a separate entry in the compatible devices tab for Enduro 2.

    TL;DR Garmin changed part numbers for Enduro 2, and as a result, for several months, nobody could build for Enduro 2.

    Sound familiar? In that case, the old entry / part number for Enduro 2 is kind of a fake placeholder. If Enduro 2 was really changed to have the base part number for Fenix 7X, then it's compatibility with that base part number which really determines whether the app is available for Enduro 2. Sort of the exact opposite situation of yours (if my guess is correct).

  • I will also say that if you or anyone else has a copy of the ConnectIQ\Devices folder from around the time that your app was last updated (Jan 18, 2025), we could try to confirm my theory that the "new" Tactix 8 part numbers didn't exist at that time.

    EDIT: of course they didn't, because Tactix 8 didn't exist at the time. Whoops my bad haha

    8b) App-specific metadata

    Note that your project's IQ file (built by the export process) is just a ZIP file. You can open it up and see which part numbers are supported (by looking at the folders and/or the manifest)