# Install Chrome Extensions

> Force-install Google Chrome extensions on macOS Devices by importing a Plist with ExtensionInstallForcelist or ExtensionSettings into an Applivery Policy.

Source: https://docs.applivery.com/en/device-management/apple/macos/policies/install-chrome-extensions/  •  Last updated: 2026-10-16

**Key topics:** Chrome extension ID, Plist with ExtensionInstallForcelist, Pinning extensions with ExtensionSettings, Verification and alternative install scripts, Troubleshooting, Applivery, Google Chrome, Chrome Web Store, macOS, Plist

---

**TL;DR:** Import a Plist with the ExtensionInstallForcelist key (com.google.Chrome payload) into a macOS Policy. Applivery scripts help you verify the result or serve as an alternative when you can't use a Policy.

The recommended way to install Google Chrome extensions on macOS is to import a Plist with the `ExtensionInstallForcelist` key (`com.google.Chrome` payload) into a macOS Policy, just like the [Chrome homepage](https://docs.applivery.com/en/device-management/apple/macos/policies/google-chrome-homepage-configuration/). Applivery scripts help you verify the result or serve as an alternative when you can't use a Policy.

## Before you start

-   macOS Devices managed by Applivery, with Google Chrome installed.
    
-   The **extension ID**.
    
-   Access to the [Applivery Dashboard](https://dashboard.applivery.io/) with permission to edit Policies and, if you use scripts, the **Resources** section.
    

## How to get an extension's ID

The ID is a string of 32 lowercase letters (from `a` to `p`) that uniquely identifies the extension. You can get it in three ways:

1.  **From Chrome Web Store.** Open the extension's page and copy the last part of the URL: `https://chromewebstore.google.com/detail/extension-name/`
    
2.  **From** `chrome://extensions`**.** Turn on **Developer mode** (top-right corner). Each installed extension shows its **ID** below the description.
    
3.  **From Terminal on a Mac with the extension installed.** The folder names in this directory are the IDs:
    
    ```bash
    ls ~/Library/Application\ Support/Google/Chrome/Default/Extensions/
    ```
    
    If you use several Chrome profiles, replace `Default` with the profile name (for example, `Profile 1`).
    

:::info
For extensions hosted outside Chrome Web Store, you get the ID the same way, but in the Plist you must use your own server's update URL instead of `https://clients2.google.com/service/update2/crx`.
:::

## Recommended method: Policy with a Plist

### Prepare the Plist

The following payload force-installs an extension. Replace `EXTENSION_ID` with your extension's ID:

```

	PayloadContent
	
			ExtensionInstallForcelist
			
				EXTENSION_ID;https://clients2.google.com/service/update2/crx
			
			PayloadDisplayName
			Google Chrome - Extensions
			PayloadIdentifier
			com.google.Chrome.extensions.REPLACE-UUID
			PayloadType
			com.google.Chrome
			PayloadUUID
			REPLACE-UUID
			PayloadVersion
			1
	
```

Each list entry has the format `EXTENSION_ID;UPDATE_URL`. To install several extensions, add one `<string>` per extension inside the same `<array>`.

#### What to put in the REPLACE-UUID placeholders

Replace each `REPLACE-UUID` with a UUID, a unique identifier with this format: `754C545B-75B5-4E50-927D-3BC06EBD47E0`. There are two places:

-   `PayloadUUID`: a full UUID.
    
-   `PayloadIdentifier`: `com.google.Chrome.extensions.` followed by a UUID. It can be the same as the `PayloadUUID` one or a different one.
    

To generate one from Terminal on a Mac (each run returns a new one):

```bash
uuidgen
```

For example, if `uuidgen` returns `A1B2C3D4-E5F6-4A7B-8C9D-0E1F2A3B4C5D`:

```xml
<key>PayloadIdentifier</key>
<string>com.google.Chrome.extensions.A1B2C3D4-E5F6-4A7B-8C9D-0E1F2A3B4C5D</string>
<key>PayloadUUID</key>
<string>A1B2C3D4-E5F6-4A7B-8C9D-0E1F2A3B4C5D</string>
```

Any UUID v4 generator works too.

#### When to generate a new UUID

<table style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Situation</p></th><th colspan="1" rowspan="1"><p>UUID</p></th></tr><tr><td colspan="1" rowspan="1"><p>Adding more extensions to the same Plist</p></td><td colspan="1" rowspan="1"><p>They don't change: add another <code>&lt;string&gt;</code> to the <code>&lt;array&gt;</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>Editing a Plist you've already imported</p></td><td colspan="1" rowspan="1"><p>Keep the same UUIDs</p></td></tr><tr><td colspan="1" rowspan="1"><p>Creating a different Plist (another Policy or another payload)</p></td><td colspan="1" rowspan="1"><p>Generate new UUIDs, so two configurations don't share an identifier</p></td></tr></tbody></table>

You don't need a new Plist or UUID for every extension.

:::warning
Put **all** force-installed extensions in a single Plist and a single Policy. If you split the `ExtensionInstallForcelist` key across several configurations that apply to the same Device, Chrome isn't guaranteed to merge them, and only one of them may stay active.
:::

### Import it into an Applivery Policy

**Open the Policy**

Once in the [**Applivery Dashboard**](https://dashboard.applivery.io/), go to any of your **Policies** 1 or [create a new one](https://docs.applivery.com/en/device-management/general-settings/create-device-policies/).

**Import the Plist**

Click the **\+ Add configuration** button on the left-hand menu, then click **\+ Import** 2.

![import](https://docs.applivery.com/int/_r2/media/09ac0a4e-3ad8-478f-9f15-3474973eec71/f3b41af3-190e-4361-9dfb-c0b1a568514a.png)

Paste the Plist or use the **Upload XML** button to upload the file.

![plist](https://docs.applivery.com/int/_r2/media/09ac0a4e-3ad8-478f-9f15-3474973eec71/417c6f5d-ffc2-46b2-9108-07b0ffa2194a.png)

**Save**

Save your changes.

### Verify the result

Once the Policy has synced to the Device, open Chrome and check:

1.  `chrome://policy` → click **Reload policies** and confirm that `ExtensionInstallForcelist` appears with the **OK** status.
    
2.  `chrome://extensions` → the extension should appear installed and marked as managed by your organization.
    

:::info
If Chrome was open when the Policy was applied, restart it to verify that the configuration has been applied.
:::

## Pin the extension to the toolbar

A force-installed extension is available in Chrome's extensions menu (the puzzle icon), but it isn't pinned to the toolbar. To have it pinned from the start, use the `ExtensionSettings` key with the `toolbar_pin` option.

`ExtensionSettings` groups all the settings for each extension in a dictionary, identified by its ID. It lets you force-install the extension and pin it to the toolbar in the same block, so it **replaces** `ExtensionInstallForcelist` for those extensions:

```

	PayloadContent
	
			ExtensionSettings
			
				aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
				
					installation_mode
					force_installed
					update_url
					https://clients2.google.com/service/update2/crx
					toolbar_pin
					force_pinned
				
			
			PayloadDisplayName
			Google Chrome - Extensions
			PayloadIdentifier
			com.google.Chrome.extensions.REPLACE-UUID
			PayloadType
			com.google.Chrome
			PayloadUUID
			REPLACE-UUID
			PayloadVersion
			1
	
```

<table style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Key</p></th><th colspan="1" rowspan="1"><p>Value</p></th><th colspan="1" rowspan="1"><p>Effect</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>installation_mode</code></p></td><td colspan="1" rowspan="1"><p><code>force_installed</code></p></td><td colspan="1" rowspan="1"><p>Force-installs the extension</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>update_url</code></p></td><td colspan="1" rowspan="1"><p>Update URL</p></td><td colspan="1" rowspan="1"><p>Same as in <code>ExtensionInstallForcelist</code> (the Chrome Web Store one, except for extensions hosted outside the store)</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>toolbar_pin</code></p></td><td colspan="1" rowspan="1"><p><code>force_pinned</code></p></td><td colspan="1" rowspan="1"><p>Pins the extension to the toolbar</p></td></tr></tbody></table>

To configure several extensions, add one key per ID inside the `ExtensionSettings` dictionary, each with its own `<dict>`. Import the Plist into the Policy just like with `ExtensionInstallForcelist`.

:::warning
Don't declare the same extension in both `ExtensionInstallForcelist` and `ExtensionSettings`. Pick one of the two keys for each extension.
:::
:::info
If you only want to install the extension and let each user decide whether to pin it, use `ExtensionInstallForcelist` and leave out `toolbar_pin`.
:::

The extension ends up installed and pinned to the Google Chrome toolbar.

## Using scripts

Applivery scripts (Bash on macOS) aren't needed to install the extension with the method above, but they're useful in two cases. You'll find more details in [Scripts](https://docs.applivery.com/en/device-management/apple/macos/scripts/).

### Verification script

Checks that the Plist with the extension has reached the Mac. Pass the extension ID as an argument (in double quotes).

```bash
#!/bin/bash
# Usage: the first argument is the Chrome extension ID
EXT_ID="$1"
PLIST="/Library/Managed Preferences/com.google.Chrome.plist"

if [ -z "$EXT_ID" ]; then
  echo "Missing the extension ID as an argument."
  exit 2
fi

if [ ! -f "$PLIST" ]; then
  echo "$PLIST does not exist: the Chrome configuration is not applied."
  exit 1
fi

if /usr/libexec/PlistBuddy -c "Print :ExtensionInstallForcelist" "$PLIST" 2>/dev/null | grep -q "$EXT_ID"; then
  echo "OK: extension $EXT_ID is in ExtensionInstallForcelist."
  exit 0
else
  echo "Extension $EXT_ID is NOT in ExtensionInstallForcelist."
  exit 1
fi
```

### Alternative script: install without a Policy (External Extensions)

If you can't use a Plist, Chrome supports registering extensions externally through one JSON file per extension in a system path. This script creates it:

```bash
#!/bin/bash
# Usage: the first argument is the Chrome extension ID
EXT_ID="$1"
DIR="/Library/Application Support/Google/Chrome/External Extensions"

if ! [[ "$EXT_ID" =~ ^[a-p]{32}$ ]]; then
  echo "Invalid extension ID: $EXT_ID"
  exit 2
fi

mkdir -p "$DIR"
cat > "$DIR/$EXT_ID.json" <<colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Symptom</p></th><th colspan="1" rowspan="1"><p>Possible cause</p></th><th colspan="1" rowspan="1"><p>What to do</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>chrome://policy</code> doesn't show <code>ExtensionInstallForcelist</code></p></td><td colspan="1" rowspan="1"><p>The Policy hasn't synced or Chrome hasn't been restarted</p></td><td colspan="1" rowspan="1"><p>Check that the Device has the Policy assigned, force a sync and restart Chrome</p></td></tr><tr><td colspan="1" rowspan="1"><p>The key shows an error</p></td><td colspan="1" rowspan="1"><p>Misspelled ID or wrong entry format</p></td><td colspan="1" rowspan="1"><p>Check that it's <code>ID;URL</code> and that the ID has 32 characters (<code>a</code>–<code>p</code>)</p></td></tr><tr><td colspan="1" rowspan="1"><p>Only one of several extensions installs</p></td><td colspan="1" rowspan="1"><p>Keys split across several configurations</p></td><td colspan="1" rowspan="1"><p>Put all extensions in a single Plist</p></td></tr><tr><td colspan="1" rowspan="1"><p>The verification script says the Plist doesn't exist</p></td><td colspan="1" rowspan="1"><p>The configuration hasn't reached the Mac</p></td><td colspan="1" rowspan="1"><p>Check the Policy assignment and the script's execution history</p></td></tr><tr><td colspan="1" rowspan="1"><p>The extension appears but is disabled</p></td><td colspan="1" rowspan="1"><p>External Extensions install waiting for user confirmation</p></td><td colspan="1" rowspan="1"><p>Switch to the Policy method (Plist)</p></td></tr></tbody></table>
