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

# Software installation status

> See where every Primo-managed app stands on each targeted device — installed, in progress, failed, or ready to install — and install, update, or uninstall it from the dashboard.

Adding software to Primo tells the fleet what *should* be installed. Installation status tells you what actually *is* installed, device by device, and lets you act on the gaps without leaving the dashboard.

For every app you manage in Primo, you get:

* The install state on each device the app targets
* The version installed on the device versus the version your package offers
* Per-app counters across the fleet: how many devices have it, how many are still working on it, how many failed
* Install, reinstall, update, and uninstall actions on a single device

## What the list covers

The scope is deliberately narrow — two rules decide whether a device and an app appear together:

* **Primo-managed software only.** Only apps you added to **MDM > Software** are tracked. Apps an employee installed themselves are never listed, even though the agent can see them on the device.
* **Targeted devices only.** A device appears for an app only if the app's targeting resolves to it — either the app targets all devices on its platform, or the device belongs to one of the app's targeted device groups.

<Info>
  This is not a full software inventory of the device. If you need the complete list of every title detected on a device, open the device in Fleet.
</Info>

## Where to find it

| Surface                                                                      | What it shows                                                           |
| ---------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| **Software** tab in the device drawer                                        | Every app targeting this device, with its status, versions, and actions |
| **Installed**, **In progress**, and **Failed** columns in **MDM > Software** | Device counts per app across the fleet                                  |
| **Devices** tab on a software page                                           | Every device this app targets, with its status and actions              |

Open the device drawer from any device list, then select the **Software** tab. On a software page, the **Devices** tab sits next to **Setup**.

The three count columns are part of the default **All** view of the software table. If you use custom views, add them from the column picker.

## Install statuses

Primo reports four statuses. They are computed on the server from what Fleet knows about the device, so the dashboard, the counters, and the device list always agree.

| Status               | Meaning                                                  |
| -------------------- | -------------------------------------------------------- |
| **Installed**        | The app is present on the device                         |
| **In progress**      | An install, update, or uninstall is queued or running    |
| **Failed**           | The app is not on the device and the last attempt failed |
| **Ready to install** | The app targets the device and has never been installed  |

<Info>
  **Presence outranks failure.** An app that is still on the device reads **Installed** even if its last install or uninstall attempt failed. **Failed** always means the app is absent — which keeps the counters and the device list honest when you triage.
</Info>

Hover an **In progress** status to see why it has not moved yet:

* If the device is online, the operation is running on it now.
* If the device is offline, the operation is queued and runs the next time the device comes online.

## Versions

The device drawer shows two version columns:

* **Installed version** — the version detected on the device
* **Library version** — the version your Primo package or App Store app offers

Either column can be empty. Fleet reports the installed version from device inventory, independently of the installs it tracks itself, so a freshly installed app or a package Fleet cannot fingerprint can read **Installed** with no version. When both versions are known and the library version is newer, the primary action becomes **Update**.

## Install, update, and uninstall

Each row exposes up to two actions. Primo picks the primary action from the status and the versions:

| Action        | When it appears                                                 |
| ------------- | --------------------------------------------------------------- |
| **Install**   | The app is **Ready to install**, or the last attempt **Failed** |
| **Reinstall** | The app is **Installed** and up to date                         |
| **Update**    | The app is **Installed** and the library version is newer       |
| **Uninstall** | The app is **Installed** and was deployed as a package          |

Actions are requests, not instant results. Primo sends the command to the device and the row switches to **In progress**; the real status lands on the next sync.

**Uninstall** is not offered for:

* Apple App Store apps and `.ipa` apps — the store manages removal
* Apps Primo installs on every device it manages
* Software whose deployment is driven by an MDM control

An action can also be temporarily unavailable. Hover the button to see which:

| Tooltip                                                   | What to do                               |
| --------------------------------------------------------- | ---------------------------------------- |
| An install or uninstall is already running on this device | Wait for the current operation to finish |
| Turn on scripts for this device to install software       | Enable scripts on the device, then retry |
| Turn on MDM for this device to install software           | Enroll the device in MDM, then retry     |

## Investigate a failure

On the **Devices** tab of a software page, a **Failed** row shows a **See in Fleet** link next to the status. Hover the link for the reason Fleet reported, and open it to read the full install output — the script result or the detection query that decided the app is missing.

Failures usually come down to one of these:

* The installer needs a flag or a pre-install step the package does not provide
* The detection query does not match how the app registers itself — see [How to find the right program name](/mdm/guides/find-program-name)
* The device did not meet a requirement of the installer, such as free disk space or a minimum OS version

## How the status refreshes

<Steps>
  <Step title="On every device sync">
    Each time a device checks in, Primo recomputes the status of every app targeting it. No scan to launch.
  </Step>

  <Step title="When you change an app">
    Adding, editing, or deleting software re-syncs the devices it used to target and the devices it now targets, so rows appear and disappear with the targeting.
  </Step>

  <Step title="When you ask for it">
    Use **Refresh** in the device drawer to re-sync one device. On a software page, open the action menu and click **Refresh device software** to re-sync every device that app targets.
  </Step>
</Steps>

<Info>
  Refreshes fan out in the background, so counters and rows update a few seconds after the request. Right after you trigger an action or a refresh, the tables poll for a minute and update on their own. A newly added app reads zero on every counter until its first sync completes.
</Info>
