# Install on any site

> Add the ShopAssist script tag, allow your domains, and choose a catalog source: product feeds or the Catalog Push API.

Source: https://shopassist.coec.dk/docs/install/generic · Updated 2026-10-01

The Generic connector works with any storefront: a custom shop, a headless frontend or a platform without a ShopAssist plugin. You combine the parts you need.

| Part                             | What it gives the assistant                           | Guide                                                                                            |
| -------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| Script tag                       | The widget on your pages                              | below                                                                                            |
| Product feed or Catalog Push API | Products, prices, stock, locations, pages             | [feeds](/docs/install/generic/product-feeds), [Push API](/docs/install/generic/catalog-push-api) |
| Generic RPC (optional)           | Order status, guest lookup, cancellations and returns | [order RPC](/docs/install/generic/order-rpc)                                                     |
| Identity JWT (optional)          | Signed-in customers                                   | [identity JWT](/docs/orders-and-identity/generic-identity-jwt)                                   |
| Cart settings (optional)         | Add to cart and checkout links                        | [checkout and cart](/docs/install/generic/checkout-and-cart)                                     |

## Requirements [#requirements]

- Any storefront: *

* An HTTPS storefront where you can add a script tag to every page.
* For feeds: a public HTTPS feed URL (optionally with Basic or header authentication). For the Push API: a server that can call an HTTPS API.

## Install [#install]

Typical setup: About 15 minutes plus a product feed or API integration

**1. Add the script tag**

Copy the script tag from **Widget → Install** in the dashboard and paste it before `</body>` on every page. Then add your storefront domains under **Allowed domains**.

**2. Choose a catalog source**

Add a product feed (Google Shopping XML, CSV or JSON, pulled at least every 60 minutes) or push your catalog with the Catalog Push API using an API key with the `catalog:write` scope. The Push API works on every plan.

**3. Optional: orders and signed-in customers**

Connect a Generic RPC endpoint for order status and actions, and mint an identity token on your server so signed-in customers can ask about their orders.

The pinned script tag with Subresource Integrity is the default for Generic stores:

```html
<script src="https://cdn.shopassist.coec.dk/widget/<version>/loader.js" async
        integrity="sha384-<published hash>" crossorigin="anonymous"
        data-shopassist-key="pk_live_YOUR_PUBLISHABLE_KEY" data-platform="generic"></script>
```

The first pinned release is published with the widget's general availability; until then use the channel loader below. Your dashboard shows the current version and hash.

The channel loader always serves the current widget and is the alternative if you don't want to update the version yourself:

```html
<script
  src="https://cdn.shopassist.coec.dk/widget/v1/loader.js"
  async
  data-shopassist-key="pk_live_YOUR_PUBLISHABLE_KEY"
  data-platform="generic"
></script>
```

Use your own key from **Widget → Install & domains**. Embed attributes are listed in [embed attributes](/docs/widget/embed-attributes).

### Allowed domains [#allowed-domains]

The widget only works on the domains you list under **Widget → Install & domains → Allowed domains** (exact origins such as `https://shop.example.com`). Add every domain that serves your storefront, including `www` and country domains. Requests from other origins are refused (`403 origin_not_allowed`).

## Connect [#connect]

Choose at least one catalog source in the dashboard under **Catalog → Data source**:

* **Product feed:** add the feed URL, its format (Google Shopping XML, CSV or JSON), language, currency and schedule (every 60 minutes or less often). See [product feeds](/docs/install/generic/product-feeds).
* **Catalog Push API:** create an API key with the `catalog:write` scope, restricted to this store, and push products from your server. Available on every plan. See [Catalog Push API](/docs/install/generic/catalog-push-api).

The store becomes active after the first successful feed run or push batch and at least one allowed domain.

## Verify [#verify]

Open your storefront: the launcher appears once the dashboard shows "Widget seen on your store". Then run through [verify your installation](/docs/install/verify-your-installation).

[Send a test message](/app/go/playground)

## Signed-in customers [#signed-in-customers]

Your server mints a short-lived identity token for the signed-in customer, and your page passes it to the widget with `ShopAssist.identify()`. See [identity JWT for Generic stores](/docs/orders-and-identity/generic-identity-jwt).

## Stock per location [#location-stock]

Send locations and per-location stock with the Push API (`locations:batch`, `inventory:batch`), a [local inventory feed](/docs/install/generic/product-feeds#local-inventory) or a [CSV import](/docs/catalog/inventory-csv-import).

## Updating [#updating]

With the pinned loader, update the version and integrity hash when a new widget release is published (the dashboard tells you when your pinned version is behind). The channel loader updates itself.

## Uninstall and data removal [#uninstall]

Remove the script tag and delete the store in **Settings → Store → Delete store**. Data is deleted 30 days later. See [uninstall and data removal](/docs/install/uninstall-and-data-removal).

## Troubleshooting [#troubleshooting]

* [The widget is not showing](/docs/troubleshooting/widget-not-showing)
* [Feed failing](/docs/troubleshooting/sync-issues#feed_failing)
* [Content Security Policy errors](/docs/troubleshooting/csp-errors)
