# Troubleshooting

> What each console warning and API error means, and how to fix it.

## The launcher does not show

1. Open the browser console and look for a warning that starts with `Iris:`. Each warning links to its entry on this page.
2. Check that your Content Security Policy allows `cdn.irisdesk.app`. See [Allowed origins and CSP](/get-started/allowed-origins/).
3. Check that the origin of the page is in **Settings → Widget → Allowed origins**.
4. Check that you did not pass `launcher: false`.

## Console warnings

| Message | What happened | Fix |
| --- | --- | --- |
| `Iris: the widget did not start, because the App ID is missing or not valid.` | `Iris.init` got no `appId`, an empty one or one longer than 64 characters. | Pass your App ID as `appId`. Copy it from **Settings → Install**. |
| `Iris: ignored <option>: <value>, because it is not a valid value.` | An `Iris.init` option or a widget setting is outside its limits, such as `verticalPadding: 300`. Iris used the workspace value. | Use a value within the limits of the [`Iris.init` options](/reference/init/#options). |
| `Iris: <method> ran before Iris.init, so nothing changed.` | `identify`, `logout` or `update` ran before `Iris.init`. After an early `identify`, the contact stays anonymous. | Call `Iris.init({ appId })` first. Calls made before `iris.js` loads wait in a queue, in order. |
| `Iris: identify got no identity token, so the contact stays anonymous.` | The token is empty or not a string. Often your token endpoint failed. | Check that your server returns an identity token, then pass it as `Iris.identify({ token })`. |
| `Iris: on ignored the listener, because the event is not "unread" or the listener is not a function.` | The event name is not `"unread"`, or the listener is not a function. | Pass `"unread"` and a function. See [Events](/reference/events/). |
| `Iris: setPageContext ignored the page context, because it is outside the limits.` | The value is not a flat object, it has more than 48 keys, or a value is too long or has the wrong type. Iris kept the earlier page context. | Keep to the [page context limits](/guides/page-context/#limits). |
| `Iris: update ignored <option>, because update changes only launcher.` | `Iris.update` got an option other than `launcher`. Iris applied `launcher` and ignored the rest. | Pass that option to `Iris.init`. |
| `Iris: ignored the unknown method "<name>".` | A queued call names a method that `iris.js` does not have, often because of a typo. | Check the method name. Copy the loader snippet again from **Settings → Install**. |
| `Iris: <action> failed: <reason>.` | A request to Iris failed, for example because the network dropped or Iris had an error. | Check your connection and the network tab of your browser, then reload the page. |

## API errors

You see these in the network tab of your browser. The console also shows a warning that links here.

| Message | What happened | Fix |
| --- | --- | --- |
| `403` `origin_not_allowed` | The origin of the page is not in the allowed origins, so Iris refused the request. The console shows `Iris: <action> failed, because the origin of this page is not allowed.` | Add the origin in **Settings → Widget → Allowed origins**. See [Allowed origins](/get-started/allowed-origins/). |
| `401` on the session request | Iris rejected the identity token. It expired, its signature does not match the identity secret, or `sub` or `exp` is missing. The console shows `Iris: <action> failed, because Iris rejected the identity token.` | Sign a new identity token with the current identity secret and both required claims. Check your code with the [test token](/guides/identify-users/#check-your-code-with-the-test-token). |
